第一个是initWithCoder
方法:因为开发者多在Storyboard中使用Autolayout,而Storyboard中的View初始化不是使用常见的initWithFrame
方法的,而是使用initWithCoder
方法来初始化View。因此自定义控件有初始化逻辑的话(如设置变量默认值什么的),注意不要只写在initWithFrame
方法里。
第二个是UIView
的translatesAutoresizingMaskIntoConstraints
属性,如果使用Autolayout,则不需要将古老的AutoresizingMask转换成Autolayout的Constraint。这个属性默认是YES
,不过貌似Storyboard创建时调用initWithCoder
方法时控件的translatesAutoresizingMaskIntoConstraints
已经是NO了。
第三个是UIView
的contentMode
属性,如果在Autolayout改变控件尺寸后需要刷新drawRect
,则需要设置contentMode
属性为UIViewContentModeRedraw
。而另一个常见的自定义控件依赖的方法:layoutSubviews
,则会被自动调用,这里不需要担心。
那么,自定义控件的初始化可以这样写:
//UIView构造方法 - (id)initWithFrame:(CGRect)aRect { if ((self = [super initWithFrame:aRect])) { [self commonInit]; } return self; } //Storyboard用 - (id)initWithCoder:(NSCoder*)coder { if ((self = [super initWithCoder:coder])) { [self commonInit]; } return self; } - (void)commonInit { /* 这里开始初始化 */ //如果需要重新调用drawRect则设置contentMode为UIViewContentModeRedraw self.contentMode = UIViewContentModeRedraw; //不允许从Autoresizing转换Autolayout的Constraints //貌似Storyboard创建时调用initWithCoder方法时translatesAutoresizingMaskIntoConstraints已经是NO了 self.translatesAutoresizingMaskIntoConstraints = NO; }
时间: 2024-10-10 21:33:48