iOS以编程方式在UITableviewcell中打破了宽高比约束

时间:2019-02-26 11:28:46

标签: ios swift xcode autolayout

我正在尝试为tableviewcell内的图像设置长宽比,但由于iOS无法完成对宽度或高度的限制,而小数位数不同于.5或.0的情况,因此该设置已损坏。

总而言之,如果约束接近其值,或者舍入为舍去小数的值,该约束不会失败/中断?

我知道问题出在很多次尝试后,由于小数点,我将通过以下示例向您展示:

使用以下代码

postImage.heightAnchor.constraint(equalToConstant: 88.9).isActive = true

我收到以下错误:

    Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000036067b0 UIImageView:0x7fb76fe397e0.height == 88.9   (active)>

视图层次结构,图像的大小为89

enter image description here

当我将高度设置为.5或.0时,它发生在我身上,它四舍五入到最接近的值.5或.0(如果我将其设置为88.6,则四舍五入为88.5,抛出错误),但是如果我设置的任何以.0或.5结尾的值都可以正常工作!

(我知道我可以将其设置为较低的优先级,但它可以给我带来更多意外行为)

(我正在以编程方式进行操作,无法通过Xib进行操作:))

编辑:整个日志:

    (
        "<NSLayoutConstraint:0x600000facd20 UIImageView:0x7fc98362fe80.height == 86.9   (active)>",
        "<NSLayoutConstraint:0x600000facd70 V:|-(0)-[UIImageView:0x7fc98362fe80]   (active, names: '|':UITableViewCellContentView:0x7fc98362f940 )>",
        "<NSLayoutConstraint:0x600000face10 UIImageView:0x7fc98362fe80.bottom == UITableViewCellContentView:0x7fc98362f940.bottom - 8   (active)>",
        "<NSLayoutConstraint:0x600000fad680 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7fc98362f940.height == 95   (active)>"
    )

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000facd20 UIImageView:0x7fc98362fe80.height == 86.9   (active)>

1 个答案:

答案 0 :(得分:1)

我相信您必须降低纵横比约束的优先级,以避免破坏约束消息。

而且,我认为您对nn.5值的工作并不完全正确。

例如,...的比率为420:360

将视图的宽度设置为59会导致自动布局高度计算

59.0 * 360.0 / 420.0 == 50.571428571428569

自动布局不会为您提供实际的视线高度50.571428571428569 ...而是会将其舍入到最接近的.5,即50.5,即少于所要求的,这样您会得到错误。

使用:

59.4 * 360.0 / 420.0 == 50.914285714285718

它四舍五入到51,比请求的,并且您不要得到错误。

更多示例:

58.5 * 360.0 / 420.0 == 50.142857142857146  // rounds down -- error
58.4 * 360.0 / 420.0 == 50.057142857142857  // rounds down -- error
58.3 * 360.0 / 420.0 == 49.971428571428568  // rounds up -- NO ERROR

将纵横比约束更改为Priority: 999会得到相同的大小结果(四舍五入到最接近的.5),但不会抛出约束约束错误。

由于您将获得相同的实际大小,因此更改优先级将仅允许自动布局“执行正确的操作”,并且不会对布局产生任何其他影响。