【问题标题】:Subclassing UIView or composing with UIView子类化 UIView 或使用 UIView 组合
【发布时间】:2009-10-28 22:27:20
【问题描述】:
我会先说我想做什么,因为我不确定我问的问题是否正确。我正在制作一个基于网格的地图,并将保存一组对象以保持地图的状态和表示。每个对象都属于 Tile 类。我应该继承 UIView 还是继承 NSObject 并拥有 UIView 的 ivar。我还计划在 UIView 中有一个 UIImageView 来加载代表地图那一点的图像。最后,我想从 NIB 加载视图。
我个人知道如何做这些事情,但不确定最佳实践。有什么想法吗?
【问题讨论】:
标签:
iphone
objective-c
uiview
interface-builder
【解决方案1】:
您是否考虑过核心动画层?您可以创建一个带有层网格的单个视图,每个层在视图中都有自己的边界和位置。听起来它可能会给你你需要的东西。在手机上,用图片设置图层的内容就这么简单:
CALayer *gridLayer = [CALayer layer];
[gridLayer setContents:(id)[gridImage CGImage]];
[gridLayer setBounds:[gridImage bounds]];
// Position the layer's center a x:25.0 y:25.0 within the view
[gridLayer setPosition:CGPointMake(25.0f, 25.0f)];
[[view layer] addSublayer:gridLayer];
变量 gridImage 是您在某处分配的 UIImage*。您只需要计算您的图层矩形和位置并相应地放置它们。
【解决方案2】:
确保您清楚地定义了哪些特定的类/对象构成了您的模型、控制器和视图。您的数据和数据逻辑应该在模型中,您的显示在视图中,并且您应该将它们与控制器联系在一起。
完成网格的最简单方法是使用由单个控制器定位的 UIImageView。该模型将跟踪地图方块之间的逻辑关系并将其传递给控制器,控制器会将图像加载到 UIIMageView 中。控制器将处理从 nib 加载所有内容。
但是,使用 CALayers 是首选的前沿方法。基本模型、控制器、视图关系相同,只是用CALayers代替了ImageViews。
【解决方案3】:
如果我理解正确,你可以创建 UIImageView 的子类。