【问题标题】:Autolayout Constraint Error with a single constraint具有单个约束的自动布局约束错误
【发布时间】:2013-01-18 12:14:13
【问题描述】:

我有一个带有一堆标签和按钮的场景。当您点击一个按钮时,视图会从底部向上滑动,其中包含控件,可以说是一种键盘。它“看起来”是这样的:

 -----------------------------
|                             |
|  [Button 1] [  Slider 1  ]  |
|                             |
|  [Button 2] [  Slider 2  ]  |
|                             |
 -----------------------------

这个“键盘”是在视图加载和动画完成将其高度从 0 切换到其固有内容大小时在最开始时创建的。此场景仅支持横向模式,当设备旋转 180 度时,我花了很长时间才将“键盘”保持在视图上。

我看到的问题会出现以下两种情况之一:

  1. 设备旋转 180 度。
  2. “键盘”被调用。

这个问题如下:

Unable to simultaneously satisfy constraints...
.
.
.
.
(
    "<NSLayoutConstraint:0x718c6c0 UIButton:0x717e0d0.centerY == UISlider:0x717d9d0.centerY>",
    "<NSLayoutConstraint:0x7190a00 UIButton:0x717e0d0.centerY == UISlider:0x717d9d0.centerY>"
)

错误日志给了我两次这个错误,每组按钮滑块一次。

我认为奇怪的是,相互冲突的约束完全相同。我以为我犯了一些复制粘贴错误并添加了两次相同的约束,但事实并非如此。

我猜这与旋转时调用 updateViewConstraints 以及我执行动画的时间有关,但我不明白为什么只有这些约束受到影响,因为在这个“键盘”视图中还有一些约束。

总而言之,这个自动布局比苹果声称的要困难得多。在我看来,当然。

有什么想法吗?

编辑:约束全部设置在代码中,主要使用视觉语言格式。我相信,“键盘”内控件的约束被添加到“键盘”视图中,这是正常的做法。

只是为了尝试一下,我更改了有问题的约束,而不是将它们添加到“键盘”子视图中,而是将它们添加到 self.view(“键盘”超级视图)中。突然之间,不再显示错误。

尽管如此,我真的很想就此事进行一些讨论,因为我仍然不知道出了什么问题,而且我只是碰巧碰巧了。我真的很想理解它。

【问题讨论】:

    标签: iphone xcode ios6 autolayout nslayoutconstraint


    【解决方案1】:

    冲突的约束完全相同的事实实际上是错误。使用自动布局,您不能有两次约束。这将产生您在上面看到的错误。

    毫无疑问,您已经添加了两次约束。您可以从内存地址中看到这一点。您有两个不同的 NSLayoutConstraint 实例,0x718c6c0 和 0x7190a00。但是,每个引用的实例都是相同的。那就是你的UIButton实例0x717e0d0的垂直中心centerY应该在UISlider0x717d9d0的中间。

    可能您的updateConstraints 方法已被调用,而您在再次添加之前没有检查约束是否已经存在。

    【讨论】:

      【解决方案2】:

      我不知道这是否对您有帮助,但我只是使用 this tutorial 来设置我应用中按钮和标签的约束

      【讨论】:

      • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(与另一个中途停留的参考相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多