0

在以可视化格式以编程方式使用自动布局时,我对在给定两个谓词时它如何做出决策感到困惑。例如,以下约束:

"H:[myTextView(>=300,<=700)]"

到目前为止,在我尝试的每台设备上,无论是 iPhone 5S、6 还是 iPad,宽度始终为 300。在什么情况下宽度会大于 300?此外,iOS 7 是我使用 Swift 部署此应用程序的目标。

从本质上讲,我希望我的视图在 iPhone 上占据大部分屏幕宽度,但在 iPad 上占据一半多一点。

我的解决方案

基于 rdelmar 的回答。

self.view.addConstraint(NSLayoutConstraint(
        item:self.infoTextView, attribute:.Width,
        relatedBy:.Equal, toItem:self.view,
        attribute:.Width, multiplier:0.23, constant:228))
4

2 回答 2

1

您不能以这种方式使用 >= 和 <= 约束,因为当您评估该表达式时,两者之间的任何值都会满足它,因此系统通常只会选择其中一个。在 iOS 8 中,您可以使用尺寸类为不同尺寸的屏幕提供不同的约束。

如果您正在为 iOS 7 编程,您需要检查您使用的设备,并相应地设置约束,或者使宽度相对于视图的宽度。我认为你必须使用其他约束方法,constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:,尽管这样做。通过使用乘数和常数,您可以使视图在 iPhone 上设置为 300,但在 iPad 上设置为 400(乘数 0.223 和常数 228 可以实现 320 点宽的手机和 768 点宽的 iPad )。

于 2014-10-07T21:17:00.310 回答
1

您的格式指定了两个约束:

myTextView.width >= 300

myTextView.width <= 700

约束求解器可以选择满足这两个约束的任何解。这意味着它每次可以选择 300,只要选择 300 不会破坏任何其他约束。

自动布局无法读懂你的想法。你需要明确你想要什么。究竟什么是“屏幕的大部分宽度”?究竟什么是“略多于一半”?

如果您的部署目标是 iOS 8,您可以使用尺寸类为 iPhone 和 iPad 定义不同的约束。您应该观看WWDC 2014 “Cocoa Touch 的新功能”视频来了解这一点。

如果您的部署目标是 iOS 7 或更早版本,您可以通过编程方式修改约束,或者您可以为 iPhone 设置一个情节提要,为 iPad 设置另一个情节提要。

于 2014-10-07T21:18:15.470 回答