控件通过xib,storyboard创建,初始化设置一定会调用initWithCoder
awakeFromNib 加载完毕的时候肯定会调用
layoutSubviews 布局子控件 位置和尺寸
利用代码证实
先创建wlisView.xib 拖两个控件 imageView 和 Label
创建一个类 wlisView.h 并且让wlisView.xib 自定义类 class wlisView
在wlisView.h 声明一个类方法
+(instancetype)wlisViewWith;
在wlisView.m文件中实现改方法 并且连线 xib中的两个子控件
#import "wlisView.h" @interface wlisView () /** 连线xib中UIImageView */ @property (weak, nonatomic) IBOutlet UIImageView *imgView; /** 连线xib中UILabel */ @property (weak, nonatomic) IBOutlet UILabel *lab; @end @implementation wlisView /** 重写initWithCoder方法 */ -(instancetype)initWithCoder:(NSCoder *)aDecoder{ if (self=[super initWithCoder:aDecoder]) { /** 打印 */ NSLog(@"%s",__func__); NSLog(@"self.frame-%@",NSStringFromCGRect(self.frame)); NSLog(@"self.imgView-%@",NSStringFromCGRect(self.imgView.frame)); NSLog(@"self.lab-%@",NSStringFromCGRect(self.lab.frame)); } return self; } -(void)layoutSubviews{ [super layoutSubviews]; /** 打印 */ NSLog(@"%s",__func__); NSLog(@"self.frame-%@",NSStringFromCGRect(self.frame)); NSLog(@"self.imgView-%@",NSStringFromCGRect(self.imgView.frame)); NSLog(@"self.lab-%@",NSStringFromCGRect(self.lab.frame)); } -(void)awakeFromNib{ [super awakeFromNib]; /** 打印 */ NSLog(@"%s",__func__); NSLog(@"self.frame-%@",NSStringFromCGRect(self.frame)); NSLog(@"self.imgView-%@",NSStringFromCGRect(self.imgView.frame)); NSLog(@"self.lab-%@",NSStringFromCGRect(self.lab.frame)); } /** 创建 */ +(instancetype)wlisViewWith{ //读取跟类文件中相同名称的xibNSStringFromClass(self) 并且创建 return [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil]lastObject]; } @end
在ViewController创建
#import "ViewController.h" #import "wlisView.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; wlisView * wl=[wlisView wlisViewWith]; [self.view addSubview:wl]; } @end
打印输出结果:
个人认为记住一个方法就好了,那就是layoutSubviews 这个方法
因为这个方法是苹果为我们准备更改控件的 为什么不用