2

我有NSLayoutConstraints使用视觉格式字符串构建的单独数组,我想用于纵向和横向方向。我尝试了两种在两者之间切换的方法:激活/停用它们,以及添加/删除它们。

激活/停用:

portaitConstraints.forEach {
    $0.active = false
}
landscapeConstraints.forEach {
    $0.active = true
}

添加/删除:

self.view.removeConstraints(portraitConstraints)
self.view.addConstraints(landscapeConstraints)

这两种方法似乎都可以正常工作并按预期运行,但是使用激活/停用方法时出现以下运行时错误:

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.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

这有一个共同的模式吗?如果它的行为符合预期,我可以安全地忽略该错误吗?一种方法与另一种方法相比是否有更多开销?我认为将“活动”属性翻转到我想要激活的属性上而不是重复向视图添加和删除约束更有意义。

或者这只是一种愚蠢的方式来做到这一点,我需要做一些NSLayoutAttributes直接改变的事情?

4

2 回答 2

1

您可能存在布局歧义,某些约束可能相互冲突。如果您没有translatesAutoresizingMaskIntoConstraints = NO为设置约束的视图进行设置,通常会发生这种情况。控制台为您提供了冲突约束的列表,您应该解决布局歧义,因为它可能导致错误的布局。这不是致命的,但如果你想要一个好看的应用程序 - 你需要看看它。

WWDC 2015 有一个很棒的视频,自动布局的奥秘,第 1 部分自动布局的奥秘,第 2 部分,描述了如何快速找到冲突的约束并解决它。这些也是一个很好的视频,可以作为一个整体了解自动布局。WWDC 上还有更多视频,例如WWDC2012、Auto Layout by ExampleBest Practices for Mastering Auto LayoutTake Control of Auto Layout in Xcode 5,其中涵盖了有关自动布局的大量信息。

于 2015-09-06T17:13:03.207 回答
0

我遇到了类似的问题,即在垂直显示器上无法满足的水平显示约束,以及在水平显示器上无法满足的垂直显示约束。关键似乎是在正确的时间停用和激活正确的约束。以下是我的做法,并最终避免了错误:

override func viewWillLayoutSubviews() {
  if view.bounds.size.height >= view.bounds.size.width {
    horizontalOrientationConstraints.forEach { $0.isActive = false }
    verticalOrientationConstraints.forEach { $0.isActive = true }
  } else {
    verticalOrientationConstraints.forEach { $0.isActive = false }
    horizontalOrientationConstraints.forEach { $0.isActive = true }
  }
  self.updateDoneButton()
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
  for constraint in horizontalOrientationConstraints + verticalOrientationConstraints {
    constraint.isActive = false
  }
}
于 2018-07-28T20:25:16.463 回答