旋转后不采用 Swift 约束

Posted

技术标签:

【中文标题】旋转后不采用 Swift 约束【英文标题】:Swift Constraints Don't Take After Rotate 【发布时间】:2015-07-06 21:58:47 【问题描述】:

我正在代码中以编程方式创建UIButton,并将其限制在ViewController 的顶部和右侧。当ViewController 加载时,UIButton 在屏幕上的正确位置。当我旋转设备时,问题就来了,约束似乎没有发生。这是我用来创建UIButton 的代码:

let xValue = UIScreen.mainScreen().bounds.width - 44
let closeButton = UIButton(frame: CGRect(origin: CGPoint(x: xValue, y: 0), size: CGSize(width: 44, height: 44)))

closeButton.setImage(UIImage(named: "close"), forState: .Normal)
closeButton.addTarget(self, action: "closeClicked", forControlEvents:.TouchUpInside)

self.view.addSubview(closeButton)

self.view.addConstraint(NSLayoutConstraint(item: closeButton, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1, constant: 0))
self.view.addConstraint(NSLayoutConstraint(item: closeButton, attribute: .Right, relatedBy: .Equal, toItem: self.view, attribute: .Right, multiplier: 1, constant: 0))

我还需要做些什么来确保在方向更改后应用约束吗?

【问题讨论】:

你在什么设备上测试? 我已经使用运行 ios 8.3 和运行 iOS 8.4 的 iPad 2 和 iPod 5 gen 的模拟器(iPad Air、iPhone 6、iPhone 6+)进行了测试。他们都表现出相同的行为 【参考方案1】:

您不应将frames 与约束结合使用。默认情况下,iOS 会将您的框架转换为约束,这会导致与您设置的约束发生冲突。创建按钮后,您需要调用:

对于 Swift 1.2:

closeButton.setTranslatesAutoresizingMaskIntoConstraints(false)

对于 Swift 2.0:

closeButton.translatesAutoresizingMaskIntoConstraints = false

这样 iOS 就不会尝试将您的框架转换为约束。然后,您需要为按钮的宽度和高度添加两个额外的约束:

closeButton.addConstraint(NSLayoutConstraint(item: closeButton, attribute: .Width,
  relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 44))

closeButton.addConstraint(NSLayoutConstraint(item: closeButton, attribute: .Height,
  relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 44))

由于您的按钮不再使用框架,您可以使用以下方法创建它:

let closeButton = UIButton()

现在,您的按钮将在所有设备的所有方向上固定在屏幕的右上角。

【讨论】:

【参考方案2】:

您只需要在 segue 上禁用动画(取消选中“动画”复选框),然后就不需要更新约束了。 可以在编辑故事板时在右侧面板的 Segue 选项中找到。

【讨论】:

以上是关于旋转后不采用 Swift 约束的主要内容,如果未能解决你的问题,请参考以下文章

冲突约束(不存在)(Swift 4)

添加约束滚动后不起作用

约束布局更改后不触发 UIButton 操作

带有 UICollectionViewDelegateFlowLayout 的 UIcollectioncell 在添加约束后不应用高度和宽度

无法同时满足约束 - LayoutConstraints

自动旋转时自动布局约束更新