2014-07-12 64 views
7

我有幾個UIView沿着包含UIView的底部佈置。我希望這些視圖的寬度始終相等,並且總是伸展以共同填充包含視圖的寬度(如底部的表情符號鍵盤按鈕)。我接近這個的方式是將相等寬度設置爲其中一個視圖,然後將該視圖的寬度約束更新爲superviewWidth/numberOfViews,這將導致所有其他視圖更新爲相同的值。尺寸變化時何處更新Autolayout約束?

我想知道在哪裏更改約束常量的代碼需要去。它需要在鍵盤首次出現在屏幕上之前進行設置,並在旋轉設備時進行更新。

我第一次嘗試解決方案是將其放在updateViewConstraints中,並通過containerView.frame.size.width計算寬度。但是這種方法在加載時被調用兩次,第一次正確計算值,但由於某種原因第二次是0.035。另一個問題是,旋轉時,containerView的寬度不是旋轉後的值,而是旋轉前的當前值。但我不想等到旋轉完成後才更新約束,因爲這些按鈕將是原始大小,然後會改變,這會對用戶產生不協調的影響。

我的問題是:哪裏是最適合放這段代碼的地方?有沒有更好的方法來計算寬度會是什麼?我可以保證它總是和屏幕寬度一樣的寬度。我在Xcode 6中使用了Size Classes,所以不建議使用willRotateToInterfaceOrientation和類似的方法。

回答

2

沒有理由手動更新寬度:

  1. 將所有的等寬在你看來,沒有間距之間相互
  2. 添加等於寬度約束到所有這些
  3. 的意見
  4. 在兩側和彼此之間的間距中添加0寬度的約束
  5. 降低一個或多個等寬度約束的優先級,以防萬一寬度不能相等分。

然後自動佈局將爲您處理所有事情。

+0

謝謝您提出更好的解決方案!精美的工作。 – Joey

8

在實施UITraitEnvironment協議的所有類上,方法traitCollectionDidChange將在特徵集合發生更改時(如旋轉時)被調用。這是在使用新的Size Classes時手動更新約束的適當場所。您也可以使用該方法設置過渡動畫willTransitionToTraitCollection

基本例如:

class ViewController: UIViewController { 

    var constraints = [NSLayoutConstraint]() 

    func updateConstraintsWithTraitCollection(traitCollection: UITraitCollection) { 
    // Remove old constraints 
    view.removeConstraints(constraints) 

    // Create new constraints 
    } 

    override func willTransitionToTraitCollection(newCollection: UITraitCollection!, 
    withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator!) { 

     super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator) 

     coordinator.animateAlongsideTransition({ (context: UIViewControllerTransitionCoordinatorContext!) in 
     self.updateConstraintsWithTraitCollection(newCollection) 
     self.view.setNeedsLayout() 
     }, completion: nil) 

    } 

    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection!) { 
    updateConstraintsWithTraitCollection(traitCollection) 
    } 
} 

除此之外我想推薦製圖,這是一個很好的庫,有助於使汽車佈局更具可讀性和愉快。 https://github.com/robb/Cartography

+0

謝謝,我敢肯定,即使我實施了drewag的解決方案,這將派上用場。 – Joey

+0

你是一個拯救生命的人。這是我終於看到並刪除我無法通過ViewDidLoad()上的UIView.constraints()和攔截屏幕方向willRotateToInterfaceOrientation()時找到的'鬼'約束。 – clearlight