2014-07-12 61 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