自定义控件时,初始化的注意事项

时间:2022-05-22 16:05:05
重写构造方法
自定义控件时,初始化的注意事项

init方法内,只负责添加子控件,不要设置frame,因为这里的frame初始化值为0
(这里用init方法不合适,因为如果将创建时,不用下图中注释的方法,而用另一种方法initWithFrame,就不会调用init方法,紧接着结果导致没有创建子控件
 
自定义控件时,初始化的注意事项
解决方法:重写initWithFrame: 方法
自定义控件时,初始化的注意事项
但如果这样重写过后,且不调用initWithFrame: 这个方法会有影响吗?不会,依然会实现.因为init方法内部会自动调用initWithFrame:这个方法,所以以后自定义方法,建议自定义initWithXXX方法)
通过xib或者storyboard来创建的控件不会调用这个initWithFrame方法,当用到alloc init创建控件对象,或者直接使用initWithFrame方法时会调用initWithFrame这个方法.其它时候会调用这个方法
自定义控件时,初始化的注意事项
如果这个控件不是通过xib storyboard创建,初始化肯定会调用这个方法initWithFrame:
自定义控件时,初始化的注意事项
如果这个控件通过xib或storyboard创建,初始化肯定会调用这个方法initWithCoder:,且初始化完毕后肯定会调用awakeFromNib:
自定义控件时,初始化的注意事项

初始化完毕,属性才会有值
自定义控件时,初始化的注意事项
这也是为什么下图结果为{{0, 0},{0 , 0}};
自定义控件时,初始化的注意事项
自定义控件时,初始化的注意事项

设置子控件的frame,用苹果提供的一个方法
这个方法会保证frame里面有值再调用
当前控件的尺寸(size)发生改变的时候就会调用,这只是一种场合,当你一调用这个创建的自定义View,就会调用这个方法
自定义控件时,初始化的注意事项
layoutSubview是很有价值的东西,它会让子控件自适应父控件
[super layoutSubviews]
父类它在这个方法里面做了一些重要的事情,如果不写,cell自带的子控件布局可能不对
自定义控件时,初始化的注意事项自定义控件时,初始化的注意事项
在类扩展中添加属性
重写set方法:在set方法中取出模型属性,给对应的子控件赋值
自定义控件时,初始化的注意事项
这里的_shop = shop,可以不写,但建议这样写,因为其它方法中可能用到属性shop,到时候可以直接拿来用