gpt4 book ai didi

ios - 在代码中更改大小类 (Swift)

转载 作者:搜寻专家 更新时间:2023-10-31 22:10:58 25 4
gpt4 key购买 nike

我一直在尝试使用纯代码(未使用 Storyboard)构建自适应布局。我使用布局 anchor 来设置约束并利用 traitCollectionDidChange 方法在不同的约束集和其他界面更改之间变化。我使用 switch 语句来调用具有相应约束集的相应方法。

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)

switch (traitCollection.horizontalSizeClass, traitCollection.verticalSizeClass) {
case (.regular, .regular):
setupRegularRegular()

case (.compact, .compact):
setupCompactCompact()

case (.regular, .compact):
setupRegularCompact()

case (.compact, .regular):
setupCompactRegular()

default: break
}

}

为了测试,我只更改了一个约束,即centerYAnchor.constraint。在纵向中,常数是 -150,在横向中,我希望将其更改为 50。对于 iPad,我将常数设置为 0。

bigLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -150).isActive = true

在 iPhone 和 iPad 之间切换时工作正常。但是,如果您开始将 iPhone 从纵向旋转到横向,则布局系统会失败,并显示:

[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x600000097890 UILabel:0x7fac02c08aa0'Main Label'.centerY == UIView:0x7fac02e0a950.centerY - 150 (active)>",
"<NSLayoutConstraint:0x604000097840 UILabel:0x7fac02c08aa0'Main Label'.centerY == UIView:0x7fac02e0a950.centerY + 50 (active)>"
)

Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x604000097840 UILabel:0x7fac02c08aa0'Main Label'.centerY == UIView:0x7fac02e0a950.centerY + 50 (active)>

我尝试覆盖各种方法并将约束的 isActive 属性设置为 false,然后再设置回 true,但这没有帮助。我在网上搜索了几天。目前没有解决方案。所以我的问题是,在旋转设备时,你如何以正确的方式在尺寸等级之间切换?是否有必要重写任何其他方法或其他方法?纯代码自适应布局有更好的解决方案吗?关于自适应布局/大小类/布局 anchor 和代码约束(不使用 Storyboard ),是否有任何最佳实践?感谢您的帮助!

附言设置约束的方法是:

func setupCompactRegular() {

bigLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -150).isActive = true

}

func setupRegularCompact() {

bigLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 50).isActive = true

}

最佳答案

问题是你正在创建新的约束..尝试持有对你的约束的引用并改变你的方法来更新它们

func setupCompactRegular() {

self.bigLabelCenterYAnchor.constant = -150

}

func setupRegularCompact() {

self.bigLabelCenterYAnchor.constant = 50

}

如果没有自动更新,立即调用 layoutIfNeeded()

关于ios - 在代码中更改大小类 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45683512/

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