纯代码/xib 自定义控件

作者: 小码码 | 来源:发表于2016-10-07 23:03 被阅读255次

    1 纯代码的方式

    • 新建一个继承自UIView的类

    • 在init方法中添加子控件

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

    • 提供一个模型属性,重写模型属性的set方法

    • 在set方法中,取出模型属性,给对应的子控件赋值

    
    // 纯代码时,用init方法
    
    - (instancetype)initWithFrame:(CGRect)frame
    
    {
    
    if (self = [super initWithFrame:frame]) {
    
    // 添加图片
    
    UIImageView *iconImageView = [[UIImageView alloc] init];
    
    iconImageView.backgroundColor = [UIColor yellowColor];
    
    [self addSubview:iconImageView];
    
    self.iconImageView = iconImageView;
    
    // 添加文字
    
    UILabel *nameLabel = [[UILabel alloc] init];
    
    nameLabel.backgroundColor = [UIColor purpleColor];
    
    nameLabel.textAlignment = NSTextAlignmentCenter;
    
    [self addSubview:nameLabel];
    
    self.namelabel = nameLabel;
    
    }
    
    return self;
    
    }
    
    /**
    
    *  布局子控件,设置子控件的frame
    
    */
    
    - (void)layoutSubviews
    
    {
    
    // 这里一定要调用super
    
    [super layoutSubviews];
    
    CGFloat shopW = self.frame.size.width;
    
    CGFloat shopH = self.frame.size.height;
    
    self.iconImageView.frame = CGRectMake(0, 0, shopW, shopW);
    
    self.namelabel.frame = CGRectMake(0, shopW, shopW, shopH - shopW);
    
    }
    
    /**
    
    *  设置数据
    
    */
    
    - (void)setShop:(XMGShop *)shop
    
    {
    
    _shop = shop;
    
    self.iconImageView.image = [UIImage imageNamed:shop.icon];
    
    self.namelabel.text = shop.name;
    
    }
    
    

    2 加载xib的方式

    
    // 方式1:
    
    NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil];
    
    // 方式2:
    
    UINib *nib = [UINib nibWithNibName:@"Test" bundle:nil]; // nil 默认是mainBundle
    
    NSArray *array = [nib instantiteWithOwer:nil object:nil];
    
    
    • 通过xib自定义控件的步骤

    • 创建一个xib文件

    • 新建一个继承自UIView的类,管理该xib文件,xib的文件名最好与类名一致

    • 修改xib中父控件的class为控件类名

    • 将子控件进行连线

    • 在set方法中给子控件设置数据

    • 提供模型属性,重写模型的set方法

    3 初始化方法

    (1)凡是通过代码创建控件的时候,会调用方法- (instancetype)initWithFrame:(CGRect)frame

    
    - (instancetype)initWithFrame:(CGRect)frame
    
    {
    
    self = [super initWithFrame:frame];
    
    if (self) {
    
    NSLog(@"initWithFrame");
    
    }
    
    return self;
    
    }
    
    

    (2)凡是通过xib,stroyboard 创建控件的时候,就会调用方法- (instancetype)initWithCoder:(NSCoder *)coder

    
    - (instancetype)initWithCoder:(NSCoder *)coder
    
    {
    
    self = [super initWithCoder:coder];
    
    if (self) {
    
    NSLog(@"initWithCoder");
    
    //注意:在此方法中不能获得子控件
    
    //        NSLog(@"%@", self.iconView);
    
    }
    
    return self;
    
    }
    
    

    (3)凡是通过xib,stroyboard 创建控件之后,就会调用方法- (void)awakeFromNib

    
    - (void)awakeFromNib {
    
    //在此方法中一定要调用[super awakeFromNib];
    
    //可以在此方法中对子控件进行初始化操作
    
    [super awakeFromNib];
    
    NSLog(@"awakeFromNib");
    
    NSLog(@"==%@", self.iconView);
    
    }
    
    

    相关文章

      网友评论

      本文标题:纯代码/xib 自定义控件

      本文链接:https://www.haomeiwen.com/subject/xffuyttx.html