布局中的问题

xiaoxiao2021-02-28  130

  最近在写一个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() } }

转载请注明原文地址: https://www.6miu.com/read-28077.html

最新回复(0)