重写构造方法

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,到时候可以直接拿来用