iOS: 让自定义控件适应Autolayout注意的问题
第一个是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; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步