【问题标题】:systemLayoutSizeFitting(_:) does not respect width or height constraints for decimal numberssystemLayoutSizeFitting(_:) 不遵守十进制数的宽度或高度限制
【发布时间】:2020-12-24 00:11:16
【问题描述】:
let aView = UIView()
let width: CGFloat = 173.5
aView.widthAnchor.constraint(equalToConstant: width).isActive = true
print(aView.systemLayoutSizeFitting(CGSize(width: width, height: 0)))

输出(在 iOS 13.7 上,可能会影响其他版本):

(173.66666666666666, 0.0)

我发现使用 0.330.66 作为小数部分会使输出的错误稍微少一些,但仍然有不需要的重复数字,例如173.33333333333334 为 0.33

我还针对高度限制复制了此内容。使用UIView.layoutFittingCompressedSize作为大小也有同样的错误输出。

这是一个错误,还是我对自动布局一无所知?

【问题讨论】:

    标签: ios autolayout uikit


    【解决方案1】:

    UIKit 不能在部分像素上绘制。

    在屏幕比例为@2x 的设备上(例如iPhone 11),您的结果将是:

    (173.5, 0.0)  // nearest half-of-a-point
    

    在屏幕比例为@3x 的设备上(如iPhone 11 Pro),您的结果将是:

    (173.66666666666666, 0.0)  // nearest third-of-a-point
    

    请注意,如果您尝试:

    let width: CGFloat = 173.25
    

    你会得到:

    (173.33333333333334, 0.0)   // iPhone 11 Pro
    (173.5, 0.0)                // iPhone 11
    

    【讨论】:

    • 在任何情况下,您都不应该对视图使用分数。这就是 CGRect 具有 .integral 属性的原因。
    • @matt 这给我目前正在做的事情带来了一些复杂性,UICollectionView 每个单元格都固定在视图宽度的一半(创建两列),但它们的高度可变。如果我想要固定宽度来降低值,那么我是否遗漏了什么或者是唯一的解决方案,所以它总是一个整数?我不是这个的忠实粉丝,因为间距反过来会稍微不准确。
    • 这当然是我必须做的,ceilfloor 之类的东西。
    猜你喜欢
    • 2023-03-24
    • 2022-10-18
    • 2015-03-06
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多