gpt4 book ai didi

ios - 在设备旋转时保持自动布局约束的事件状态

转载 作者:可可西里 更新时间:2023-11-01 06:22:48 25 4
gpt4 key购买 nike

我注意到,当我以编程方式更新我的自动布局约束时,所有更改都会在我旋转屏幕时恢复。

重现问题:

  • 带有 UIView 和 2 个约束的基本 Storyboard 界面:

    1. 宽度等于 superview.width (multiplier 1) active
    2. 宽度等于 superview.width(乘数 1/2)禁用
  • 创建这 2 个约束并将其与 IBOutlet 链接

  • 以编程方式禁用第一个约束并启用第二个约束。
  • 旋转设备,第一个约束激活,第二个约束禁用。

对我来说似乎是个错误。

你怎么看?

截图:

Storyboard: enter image description here

约束#1:

enter image description here

约束#2:

enter image description here

最佳答案

尺寸分类

Installed 是指 Size Classes 安装,不是active/inactive

您必须以编程方式创建另一个约束,并激活/停用那个约束。这是因为您不能更改约束的乘数 (Can i change multiplier property for NSLayoutConstraint?),也不能修改大小类 (activateConstraints: and deactivateConstraints: not persisting after rotation for constraints created in IB)。

有几种方法可以做到这一点。在下面的示例中,我创建了您的 x1 约束的副本,带有乘数或 1/2。然后我在两者之间切换:

@IBOutlet var fullWidthConstraint: NSLayoutConstraint!
var halfWidthConstraint: NSLayoutConstraint!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
halfWidthConstraint = NSLayoutConstraint(item: fullWidthConstraint.firstItem,
attribute: fullWidthConstraint.firstAttribute,
relatedBy: fullWidthConstraint.relation,
toItem: fullWidthConstraint.secondItem,
attribute: fullWidthConstraint.secondAttribute,
multiplier: 0.5,
constant: fullWidthConstraint.constant)
halfWidthConstraint.priority = fullWidthConstraint.priority
}

@IBAction func changeConstraintAction(sender: UISwitch) {
if sender.on {
NSLayoutConstraint.deactivateConstraints([fullWidthConstraint])
NSLayoutConstraint.activateConstraints([halfWidthConstraint])
} else {
NSLayoutConstraint.deactivateConstraints([halfWidthConstraint])
NSLayoutConstraint.activateConstraints([fullWidthConstraint])
}
}

iOS 9+Xcode 7+ 上测试。

关于ios - 在设备旋转时保持自动布局约束的事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130999/

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