首页 > 解决方案 > systemLayoutSizeFitting(_:) 不遵守十进制数的宽度或高度限制

问题描述

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.layoutFittingCompressedSizeas 大小也有相同的错误输出。

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

标签: iosautolayoutuikit

解决方案


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

推荐阅读