Apple 非常清楚地定义了如何UIView
在文档中进行子类化。
查看下面的列表,特别是看看initWithFrame:
and layoutSubviews
。前者旨在设置您的框架,UIView
而后者旨在设置框架及其子视图的布局。
还请记住,initWithFrame:
仅当您以UIView
编程方式实例化时才调用它。如果您从 nib 文件(或情节提要)加载它,initWithCoder:
将使用。并且initWithCoder:
框架中还没有计算出来,所以你不能修改你在Interface Builder中设置的框架。正如此答案中所建议的那样,您可能会考虑调用initWithFrame:
frominitWithCoder:
以设置框架。
最后,如果您UIView
从 nib(或故事板)加载您的,您也有awakeFromNib
机会执行自定义框架和布局初始化,因为当awakeFromNib
被调用时,可以保证层次结构中的每个视图都已取消存档和初始化。
来自NSNibAwaking
(现在被 doc 取代awakeFromNib
)的文档:
可以从 awakeFromNib 中安全地向其他对象发送消息——到那时,可以确保所有对象都未归档和初始化(当然不一定要唤醒)
还值得注意的是,使用自动布局,您不应该明确设置视图的框架。相反,您应该指定一组足够的约束,以便布局引擎自动计算框架。
直接来自文档:
覆盖的方法
初始化
initWithFrame:
建议您实现此方法。除了或代替此方法,您还可以实现自定义初始化方法。
initWithCoder:
如果您从 Interface Builder nib 文件加载视图并且您的视图需要自定义初始化,请实施此方法。
layerClass
仅当您希望视图使用不同的 Core Animation 层作为其后备存储时才实施此方法。例如,如果您使用 OpenGL ES 进行绘图,您可能希望覆盖此方法并返回 CAEAGLLayer 类。
绘图和印刷
约束
requiresConstraintBasedLayout
如果您的视图类需要约束才能正常工作,请实施此类方法。
updateConstraints
如果您的视图需要在子视图之间创建自定义约束,请实施此方法。
alignmentRectForFrame:
,frameForAlignmentRect:
实现这些方法来覆盖您的视图如何与其他视图对齐。
布局
sizeThatFits:
如果您希望视图具有与调整大小操作期间不同的默认大小,请实施此方法。例如,您可以使用此方法来防止您的视图缩小到无法正确显示子视图的程度。
layoutSubviews
如果您需要对子视图的布局进行比约束或自动调整大小行为提供的更精确的控制,请实施此方法。
didAddSubview:
,willRemoveSubview:
根据需要实现这些方法来跟踪子视图的添加和删除。
willMoveToSuperview:
,didMoveToSuperview
根据需要实现这些方法来跟踪当前视图在您的视图层次结构中的移动。
willMoveToWindow:
,didMoveToWindow
根据需要实现这些方法来跟踪您的视图到不同窗口的移动。
事件处理:
touchesBegan:withEvent:
, touchesMoved:withEvent:
, touchesEnded:withEvent:
,touchesCancelled:withEvent:
如果需要直接处理触摸事件,请实现这些方法。(对于基于手势的输入,请使用手势识别器。)
gestureRecognizerShouldBegin:
如果您的视图直接处理触摸事件并且可能希望防止附加的手势识别器触发其他操作,请实现此方法。