iOS在UITableviewcell中以编程方式断开纵横比约束

iOS在UITableviewcell中以编程方式断开纵横比约束,ios,swift,xcode,autolayout,Ios,Swift,Xcode,Autolayout,我正在尝试为tableviewcell内的图像设置纵横比,但由于iOS无法使用与.5或.0不同的小数来完成宽度或高度的限制,因此该纵横比被破坏 无论如何,如果约束接近其值,或者它四舍五入到一个删除小数点的值,那么可以确保约束不会失败/中断 我知道问题是因为十进制数。经过多次尝试,我将用以下示例向您展示: 使用以下代码 postImage.heightAnchor.constraint(equalToConstant: 88.9).isActive = true 我得到以下错误: Wil

我正在尝试为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

当我设置一个不同于.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)>
(
"",
"",
"",
""
)
将尝试通过打破约束进行恢复
我认为您必须降低纵横比约束的优先级,以避免破坏约束消息

而且,我认为你对
nn.5
值起作用的看法不太正确

例如。。。以
420:360的比例:

将视图宽度设置为
59
将导致自动计算

59.0 * 360.0 / 420.0 == 50.571428571428569
自动布局不会为您提供实际视图高度
50.571428571428569
。。。它将把它四舍五入到最接近的
.5
,即
50.5
,该值小于请求值,因此您将得到错误

与:

它四舍五入到
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
),但不会引发“断开约束”错误


由于您将获得相同的实际大小,更改优先级只会允许自动布局“做正确的事情”,并且不会对布局产生任何其他影响。

我认为尝试将高度设置为88.9是没有意义的,您也不应该这样做。因为88.9点如何转化为像素?假设您使用的是@2x设备,因此一个点的高度为2像素。那么88.9点就是177.8像素。不管怎么说,这都是必须的。88.5将变成177像素,这确实使sense@FilipD88.9只是一个例子,我试图设置纵横比,当我设置纵横比420/360+插入时,它会随着设备宽度的变化而变化。当它断开时,你能显示Xcode给你的整个错误消息吗?应该有一个约束列表,UIKit从中选择它将打破的约束。@pckill我刚刚编辑了它以添加整个日志:)错误确实表明95-8不等于86.9,因此布局引擎尝试打破一个约束是正确的。但是,您的单元格如何确定95内容视图高度?这似乎是正确的,对吗?也许您不需要使用imageview高度约束?
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