gpt4 book ai didi

ios - 大小更改时在哪里更新自动布局约束?

转载 作者:IT王子 更新时间:2023-10-29 05:50:06 26 4
gpt4 key购买 nike

我有几个 UIView 沿着包含 UIView 的底部布置。我希望这些 View 始终等宽,并且始终拉伸(stretch)以共同填充包含 View 的宽度(如底部的表情符号键盘按钮)。我接近这个的方法是为其中一个 View 设置相等的宽度,然后将该 View 的宽度约束更新为 superviewWidth/numberOfViews 这将导致所有其他 View 更新为相同的值。

我想知道更改约束常量的代码需要去哪里。它需要在键盘第一次出现在屏幕上之前设置,并在旋转设备时更新。

我的第一个解决方案尝试是将它放在 updateViewConstraints 中并通过 containerView.frame.size.width 计算宽度。但是这个方法在加载时被调用了两次,第一次它正确地计算了值,但是由于某种原因第二次 containerView 的宽度是 0.0。另一个问题是,在旋转时,containerView 的宽度不是旋转后的值,而是旋转前的当前值。但我不想等到旋转完成后才更新约束,因为按钮将是原始大小,然后会发生变化,这会让用户感到不快。

我的问题是:把这段代码放在哪里最合适?有没有更好的方法来计算宽度?我可以保证它的宽度始终与屏幕宽度完全相同。我在 Xcode 6 中使用 Size Classes,因此 willRotateToInterfaceOrientation 和类似的方法已被弃用。

最佳答案

在所有实现 UITraitEnvironment 协议(protocol)的类上,方法 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)
}
}

除此之外,我想推荐 Cartography,这是一个不错的库,有助于使自动布局更具可读性和趣味性。 https://github.com/robb/Cartography

关于ios - 大小更改时在哪里更新自动布局约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24716136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com