AutoLayout相关
资料引用:
下面这个讲了AutoLayout如何实现自动和使用传统的frame相结合
http://www.cocoachina.com/industry/20140521/8498.html
1.从viewController 到 view
首先我们看一下 使用了autoLayout的xib 是如何工作的 :
我们开始:
ViewController * viewC = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];
_window.rootViewController = viewC
(下面是几个方法)
- (void)viewDidLoad
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
-(void)awakeFromNib
-(void)updateViewConstraints
-(void)layoutSubviews
他们的调用顺序是什么呢?
1.1首先对ViewController类发送alloc消息的时候分配了空间; 使用initWithNibName进行初始化的时候,去读取xib文件, xib被唤醒,调用awakeFromNib,此时还没有self的概念 这时候如果去调用self的话(e.g [self.view doSth])会实例化新的ViewController ,继续往后的话你会发现viewDIdload被调用两次,因为其实实例化了是两个不同的实例.
1.2 将nib唤醒后调用
-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
并且返回初始化好的对象
1.3 调用viewDidLoad 这时候会发现此时视图的frame 是xib中的frame 而非实际显示的frame 因为此时还没有通过约束进行布局
1.4调用
-(void)updateViewConstraints 此时会通过约束进行frame的定制工作
1.5 上述工作完成后 调用视图的layoutSubviews
-(void)layoutSubviews
很明显在layoutSubviews 改变 视图frame的行为是不理智的因为 在layoutSubView 之前会读取约束把你设置的frame给干掉