苹果在文档中非常明确地定义了如何细分UIView
.
看看下面的列表,特别是看一下initWithFrame:
和layoutSubviews
.前者用于设置UIView
的框架,而后者用于设置其子视图的框架和布局.
还要记住,只有在以编程方式实例化UIView
时,才会调用initWithFrame:
.如果您是从nib文件(或故事板)加载,将使用initWithCoder:
.在initWithCoder:
中,框架尚未计算,因此无法修改在Interface Builder中设置的框架.按照建议in this answer,您可以考虑从initWithCoder:
拨打initWithFrame:
来设置帧.
最后,如果您从NIB(或故事板)加载UIView
,您也有机会执行自定义框架和布局初始化,因为当调用awakeFromNib
时,可以保证层次 struct 中的每个视图都已解压和初始化.
从NSNibAwaking
号文件(现在被awakeFromNib
号文件取代)起:
可以从wakeFromNib内部安全地将消息发送到其他对象-到那时,可以确保所有对象都未存档和初始化(当然,不一定被唤醒)
同样值得注意的是,使用自动布局时,您不应该显式设置视图的框架.相反,您应该指定一组足够的约束,以便布局引擎自动计算框架.
直接从documentation分开始:
要重写的方法
初始化
100建议您实现此方法.您还可以实现自定义初始化方法,
或者,代替这种方法.
100如果从Interface Builder nib文件加载视图,并且视图需要自定义
100仅当您希望视图使用不同的核心动画层作为其后备存储区时,才实现此方法.例如,
如果您正在使用OpenGL ES进行绘图,您可能希望
重写此方法并返回CAEAGLLayer类.
绘画和印刷
约束条件
100如果视图类需要约束才能正常工作,则实现此类方法.
100如果视图需要在子视图之间创建自定义约束,请实现此方法.
100、101实现这些方法以覆盖视图与其他视图的对齐方式.
布局
100如果希望视图在调整大小时具有不同于正常情况下的默认大小,请实现此方法
运营部.例如,您可以使用此方法来防止您的
视图从收缩到无法显示子视图的程度
正确无误.
100如果需要对子视图布局进行比约束或更精确的控制,请实现此方法
自动调整大小行为提供了.
100、101根据需要实现这些方法以跟踪子视图的添加和移除.
100、101根据需要实施这些方法,以跟踪当前视图在视图中的移动
100、101根据需要实现这些方法,以跟踪视图到不同窗口的移动.
事件处理: