苹果公司非常清楚地定义了如何UIView在文档中进行子类化。
请查看下面的列表,特别是查看initWithFrame:和layoutSubviews。前者用于设置您的框架,UIView而后者则用于设置框架及其子视图的布局。
还请记住,initWithFrame:仅当您以UIView编程方式实例化时才调用它。如果您是从笔尖文件(或情节提要)加载的,initWithCoder:则将使用。并且initWithCoder:尚未计算框架中的框架,因此您无法修改在Interface Builder中设置的框架。如该答案中所建议,您可能会想到initWithFrame:从进行呼叫initWithCoder:以设置框架。
最后,如果UIView从笔尖(或情节提要)中加载图像,还可以awakeFromNib执行自定义框架和布局初始化,因为awakeFromNib调用时,可以确保层次结构中的每个视图都已取消存档和初始化。
从的文档NSNibAwaking(已由的文档取代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: 如果您的视图直接处理触摸事件,并且可能希望阻止附加的手势识别器触发其他操作,请实施此方法。