UI基础-day04-Shopping-07自定义控件-1设置子控件的frame

UI基础-day02-Shopping-01搭建商城基本框架
UI基础-day02-Shopping-02添加一个商品
UI基础-day02-Shopping-03九宫格排序
UI基础-day02-Shopping-04优化添加和删除功能
UI基础-day02-Shopping-05加载数据
UI基础-day02-Shopping-06懒加载-1基础
UI基础-day03-Shopping-06懒加载-2Plist文件读取
UI基础-day03-Shopping-06懒加载-3字典转模型

分析

  1. 商品View里面元素的布局,其实ViewController并不关心,如果将其分离出来,则减少ViewController的负担,且减少对ViewController的依赖.
  2. 商品View的封装,能够实现代码的重用! 在不修改代码的情况下,可以使商品View在多处使用.
  3. 商品View的封装,能够实现更改封装好的商品View,多处引用的商品View则一起更改了! (一处更改,多处同时更改! 维护成本低)

基本概念

  1. 什么是自定义控件?
    继承自系统自带的控件,写一个属于自己的控件(如: 图片在上,文字在下的商品View )
  2. 自定义控件的作用?
    外部直接调用,不需要知道控件怎么实现,避免对控件的更改!(封装控件的内部细节,如: 系统自带Button等控件,不准确的说,是属于自定义控件)

代码

#import "HUHShopView.h"
@interface HUHShopView ()
@property (nonatomic, weak) UIImageView *imgView;
@property (nonatomic, weak) UILabel *labTemp;
@end

自定义商品View

-(instancetype)init{
    if (self = [super init]) {
        UIImageView * imgView = [[UIImageView alloc]init];
        imgView.backgroundColor = [UIColor redColor];
        [self addSubview:imgView];
        self.imgView = imgView;
        
        UILabel *labTemp = [[UILabel alloc]init];
        labTemp.backgroundColor = [UIColor greenColor];
        [self addSubview:labTemp];
        self.labTemp = labTemp;
    }
    return  self;
}

分析:

  1. [super init] 一定要调用父类的init方法,避免出现没必要出现的错误!( [super init]方法,系统有一些格外的操作)
  2. 初始化方法开始的时候,当前控件是没有值得!


  3. 为什么self.frame是没有值呢?

    在ViewController中,使用XMGShopView自定义类时,
    97行: alloc - 分配内存空间, init - 初始化,在alloc,init这一刻,并没有设置frame.所以在97行,调用init方法时,frame并没有值.
    在99行时,才设置frame
  4. 那么怎么给商品View里控件设置frame呢?
    系统专门提供了一个方法!- (void)layoutSubviews;
    layoutSubviews详解
  5. 为什么需要通过实例化对象的方式,给属性赋值?


设置子控件的frame

- (void)layoutSubviews{ //在此方法里面的,self.frame 是有值得.
    [super layoutSubviews];
    CGFloat shopW = self.frame.size.width; 
    CGFloat shopH = self.frame.size.height;
   
    self.imgView.frame = CGRectMake(0, 0, shopW, shopW);
    self.labTemp.frame = CGRectMake(0, shopW,shopW,shopH-shopW);
}

你可能感兴趣的:(UI基础-day04-Shopping-07自定义控件-1设置子控件的frame)