佈局中的問題

  最近在寫一個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()
    }
 }





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章