最近在写一个demo 遇到一个问题 , view是用storyboard来设置的, 约束也是直接拉的线, 但是当view往上滑动的时候 在没有改变约束的情况下 只是改变了子view的center, 并没有起作用, 界面还是原来的界面, 后来发现当view的frame重新改变的时候, 会重新加载layoutsubviews方法, 会重新加载xib/storyboard中的约束, 所以在viewdidload中改变的子view的一些center并没有作用, 然后整理了一下遇到的一些问题的原因如下
通过xib/storyboard创建自定义控件会调用如下方法, 是从xib, storyboard里正在解析且视图全部加载完成之前的时候调用, nsCoder是xib解析器
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder: aDecoder];
if (self) {
}
return self;
}
- (void)awakeFromNib{}也是通过xib/Stroyboard创建自定义控件时调用, 不同的是该方法是当所有控件全部加载完成后才调用
layoutSubviews在一下情况下会被调用
1.init初始化不会触发layoutSubviews
2.addSubview会触发layoutSubviews
3.设置view的Frame会触发layoutSubviews, 当然前提是frame的值设置前后发生了变化
4.滚动一个UIScrollview会触发layoutSubviews
5.旋转Screen会触发父UIView上的layoutSubviews事件
6,改变一个UIView大小的时候也会触发UIView上的layoutSubviews事件
7,直接调用setLayoutSubviews
在做一个demo的时候 view的布局是用storyboard设置的 约束是在storyboard中拉的 用的是constraint
但是在做动画的时候 直接改变约束是做不了动画的
需要如下self.view.layoutIfNeeded()方法来帮助实现
@IBAction func switchAction(sender: UISwitch) { updateConstraintsForMode(sender.on) UIView.animateWithDuration(1.0) { () -> Void in self.view.layoutIfNeeded() } }