View自定义控件的封装

  • 为什么要封装view

    • 如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心
    • 外接可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
  • 封装控件的基本步骤

    • 新建一个类继承自UIView
    • 在initWithFrame:方法中添加子控件,提供遍历构造方法

/**

  • 初始化

  • @param frame

  • @return WXShopView
    */
    -(instancetype)initWithFrame:(CGRect)frame
    {
    if(self = [super initWithFrame:frame])
    {

    //        self.backgroundColor = [UIColor orangeColor];
    
    // 添加图片
    UIImageView *iconView = [[UIImageView alloc] init];
    iconView.backgroundColor = [UIColor blueColor];
    [self addSubview:iconView];
    self.iconView = iconView;
    
    // 添加文字
    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor redColor];
    label.font = [UIFont systemFontOfSize:11];
    label.textAlignment = NSTextAlignmentCenter;
    [self addSubview:label];
    self.nameLabel = label;
    

    }

    return self;
    }


- #####在layoutSubviews方法中设置子控件的frame(一定要调用super的layoutSubviews)

```objc
/**
*  控件大小改变事件
*/
-(void)layoutSubviews
{
    [super layoutSubviews];

    float shopW = self.frame.size.width;
    float shopH = self.frame.size.height;

    self.iconView.frame = CGRectMake(0, 0, shopW, shopW);
    self.nameLabel.frame = CGRectMake(0, shopW, shopW, shopH - shopW);
}
  • 增加模型属性,在模型属性的set方法中设置数据到子控件
/**
*  Shop的set方法
*
*  @param shop
*/
-(void)setShop:(Shop *)shop
{
  _shop = shop;

  self.iconView.image = [UIImage imageNamed:shop.icon];
  self.nameLabel.text = shop.name;
}
  • 注意点

    • 使用initWithFrame初始化方法,因为在调用init方法之后系统会再调用initWithFrame方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容