iOS 8 - AutoLayout问题 - UITableViewCell内的UIImageView忽略宽度约束

时间:2014-08-22 11:36:50

标签: ios objective-c uiimageview autolayout ios8

我对iOS 8 autolayout有疑问 我希望自定义UITableviewCell包含UILabel和5 UIImageView。我希望图像以横向模式显示,但不能以纵向模式显示,因为UILabel会被挤压缩小。

我在界面构建器中设计了视图并添加了以下约束(以及其他):

 1. priority 1000: Label width >= 120px
 2. priority 1000: ImageView[1..5]
    horizontal space to next one = 0px (to align them next to each
    other, the rightmost image view got horizontal space = 0 to content
    view to align them to the right side) 
 3. priority  999: ImageView[1..5]
    width = 40px 
 4. priority  998: ImageView[1..5] width =  0px (hide image
    views if the 40px constraint can't be satisfied because of the
    required label width)

我还设置ImageView使图像居中并剪辑子视图,并将内容压缩优先级设置为1(最低)。 UILabel内容拥抱优先级我也设置为1,因此如果文本短于120px,它甚至会调整大小。

现在发生的事情是:

  • 风景模式:
    一切正常 | Labelxxxxx img1 img2 img3 img4 img5 |
  • 肖像模式:
    图像视图被挤压到像10px这样的东西(这意味着它打破了约束#3(40px宽度)以满足约束#1(标签宽度),但它没有将图像视图宽度设置为0px,这将满足约束#4 )
    | Labelxxxxx im.im.im.im.im. |

我没有得到任何关于任何不可满足约束的异常或日志消息(即使图像视图被挤压到10px,也不会出现40px约束)

提前感谢您提供的任何帮助!

- 编辑 -

我尝试了一些替代方法,包括以编程方式设置约束,但看起来它们在使用IB时也按预期设置。
难道不可能设置具有不同优先级的2个矛盾约束 - 只要具有更高优先级的约束需要被打破以获得更高约束的优势,第二个应该被用作故障转移?
(在我的情况下:标签宽度=最高优先级,中断ImageView宽度40px约束 - > ImageView宽度0px作为故障转移)

2 个答案:

答案 0 :(得分:0)

我可能会将IBOutlets连接到宽度约束,并在旋转时将宽度更改为0.

答案 1 :(得分:0)

我有类似的问题,但通过以下方法解决

  1. 在UITableViewCell中添加了一个DummyView,并将DummyView的所有方面都固定到UITableViewCell。

  2. 现在在DummyView中添加所有图像,标签和其他子视图。

  3. 为DummyView和您添加的子视图创建IBOutLet。

  4. 以编程方式删除所有约束

  5. 以编程方式根据设备方向添加所有约束。