Jor*_*n H 8 rotation uiview ios autolayout swift
我有几个UIView沿着包含的底部布置UIView.我希望这些视图始终具有相等的宽度,并始终拉伸以共同填充包含视图的宽度(如底部的表情符号键盘按钮).我接近这个的方法是为其中一个视图设置相等的宽度,然后只更新该视图的宽度约束,superviewWidth / numberOfViews这将导致所有其他视图更新为相同的值.
我想知道更改约束常量的代码需要去哪里.需要在键盘首次出现在屏幕上之前进行设置,并在旋转设备时进行更新.
我第一次尝试解决方案是将其放入updateViewConstraints并计算宽度containerView.frame.size.width.但是这个方法在加载时调用两次,第一次正确计算值,但第二次出于某种原因,containerView宽度为0.0.另一个问题是,旋转时,containerView宽度不是旋转后的值,而是旋转前的当前值.但是我不想等到旋转完成后更新约束,因为按钮将是原始大小然后更改将对用户产生不利影响.
我的问题是:放置此代码的最合适位置在哪里?有没有更好的方法来计算宽度?我可以保证它的宽度始终与屏幕宽度完全相同.我在Xcode 6中使用Size Classes,因此willRotateToInterfaceOrientation不推荐使用类似的方法.
在实现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)
}
}
Run Code Online (Sandbox Code Playgroud)
除此之外,我想推荐Cartography,这是一个很好的库,有助于使自动布局更具可读性和愉悦性.https://github.com/robb/Cartography
没有理由手动更新宽度:
然后自动布局将为您处理一切。
| 归档时间: |
|
| 查看次数: |
9320 次 |
| 最近记录: |