2016-11-27 48 views
2

我創建了UIView子類,並在其中添加了一些imageViews和標籤。我用Visual Format創建了constraints。視圖佈局對於不同大小的類別是不同的。我使用下面的代碼來確定尺寸等級。如何更新方向變化的UIView的子類中的自動佈局約束

let rule = UITraitCollection(horizontalSizeClass: .regular) 
let isHorizontalRegular = self.traitCollection.containsTraits(in: rule) 
if isHorizontalRegular { 
// constraints for Horizontal Regular size class 
} else { 
// constraints for other size class 
} 

因爲我沒有得到在init方法大小類的信息,所以我創造了所有的自動佈局constraintsupdateConstraints()方法創建的。

基於這個實現我有一些問題。

  1. 它是正確的做法在重寫的方法updateConstraints()創建的所有constraint
  2. 如果不是,這是根據尺寸等級創建自動佈局constraints的西方方式。
  3. 如何更新方向更改的自動佈局constraints(因爲我使用可視化格式創建自動佈局constraints)?

我知道我可以使用UIViewController生命週期方法解決我的問題。但我正在使用@IBDesignable在故事板上呈現視圖。那麼是否有可能在UIView子類中實現這些。

請幫我解決這些問題。

+0

你看過或使用覆蓋'didLayoutSubviews'? – TheValyreanGroup

回答

0

小心,一些鏈接繼續Obj-C來了。

第一步是學習整個視圖生命週期this should help。下一步是瞭解adaptive layout是什麼。

關注這些替代:

viewDidLoad中(): 在這裏,你可以設置你的約束。確保子視圖已加載,並且translationAutoresizingMaskIntoConstraints對於所有內容都是錯誤的。

viewWillLayoutSubviews(): 我傾向於在這裏做我的方向變化,但僅僅是因爲我需要知道,如果整體範圍是縱向(高>寬)或橫向(寬度>高度)。聽起來你有一個更好的地方....

viewWillTransition(尺寸:與協調:): 這是任何尺寸級別的變化會發生 - 或者不是。 iPad也可以滑出或分割視圖。只要小心,基本的iPad方向變化不會意味着尺寸類更改,因爲它們是常規/常規。儘管如此,這個功能將被打破。

這裏是什麼,我通常會做一個模板:

var p = [NSLayoutConstraint]() 
var l = [NSLayoutConstraint]() 
var initialOrientation = true 
var isInPortrait = false 

override func viewDidLoad() { 
    super.viewDidLoad() 
    setUpConstraints() 
}  

override func viewWillLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    if initialOrientation { 
     initialOrientation = false 
     if view.frame.width > view.frame.height { 
      isInPortrait = false 
     } else { 
      isInPortrait = true 
     } 
     orientationChanged() 
    } else { 
     if view.orientationHasChanged(&isInPortrait) { 
      orientationChanged() 
     } 
    } 
} 
func setUpConstraints() { 
    view.turnOffAutoResizing() 
    // append your portrait (p) and landscape (l) constraint arrays here 
} 

extension UIView { 

    public func turnOffAutoResizing() { 
     self.translatesAutoresizingMaskIntoConstraints = false 
     for view in self.subviews as [UIView] { 
      view.translatesAutoresizingMaskIntoConstraints = false 
     } 
    } 
    public func orientationHasChanged(_ isInPortrait:inout Bool) -> Bool { 
     if self.frame.width > self.frame.height { 
      if isInPortrait { 
       isInPortrait = false 
       return true 
      } 
     } else { 
      if !isInPortrait { 
       isInPortrait = true 
       return true 
      } 
     } 
     return false 
    } 
    public func setOrientation(_ p:[NSLayoutConstraint], _ l:[NSLayoutConstraint]) { 
     NSLayoutConstraint.deactivate(l) 
     NSLayoutConstraint.deactivate(p) 
     if self.bounds.width > self.bounds.height { 
      NSLayoutConstraint.activate(l) 
     } else { 
      NSLayoutConstraint.activate(p) 
     } 
    } 
} 

這可能是一個有點矯枉過正滿足您的需求,但你應該能夠得到它的要點。

相關問題