3

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

 -----------------------------
|                             |
|  [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(“键盘”超级视图)中。突然之间,不再显示错误。

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

4

2 回答 2

2

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

当然,您已经添加了两次约束。您可以从内存地址中看到这一点。您有两个不同的NSLayoutConstraint实例,0x718c6c0并且0x7190a00. 但是,每个引用的实例都是相同的。那就是centerY您的UIButton实例的垂直中心0x717e0d0应该在UISlider 0x717d9d0.

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

于 2013-07-11T15:18:08.190 回答
1

我不知道这是否对您有帮助,但我只是使用本教程在我的应用程序中设置按钮和标签的约束

于 2013-11-06T18:06:12.350 回答