在 iOS 14 中获得 Font.Weight
Get Font.Weight in iOS 14
在 iOS 13 和低版本中,我 Font.Weight 使用 UIFont
的扩展
var weight: UIFont.Weight {
guard let traits = fontDescriptor.object(forKey: .traits) as? [UIFontDescriptor.TraitKey: Any], let weightValue = traits[.weight] as? CGFloat else { return .regular }
let weight = UIFont.Weight(rawValue: weightValue)
return weight
}
但是由于iOS 14 weightValue 是错误的。
例如:
let font = UIFont(name: "AvenirNext-Bold", size: 21)
print(font?.weight.rawValue)
print(font?.weight == .bold)
iOS 14 - 0.40000000000000002 假
iOS 13 - 0.40000000596046448 真
有人遇到过吗?
这不是错误。事实上,在小数点后很多位(在本例中为 16 位)之后,它预计是不准确的。浮点数是通过 IEEE 754 单精度浮点运算标准计算的。原始标准仅精确到 7 decimal places for integers between 4 and 6, but this has iteratively improved since the original, for example in 2019 and 2020 (see here 以了解详细信息)。
你看到的应该是条件投射的效果吧。从 Float
到 CGFloat
的转换失去了精度。
在 iOS 13 和低版本中,我 Font.Weight 使用 UIFont
的扩展var weight: UIFont.Weight {
guard let traits = fontDescriptor.object(forKey: .traits) as? [UIFontDescriptor.TraitKey: Any], let weightValue = traits[.weight] as? CGFloat else { return .regular }
let weight = UIFont.Weight(rawValue: weightValue)
return weight
}
但是由于iOS 14 weightValue 是错误的。 例如:
let font = UIFont(name: "AvenirNext-Bold", size: 21)
print(font?.weight.rawValue)
print(font?.weight == .bold)
iOS 14 - 0.40000000000000002 假
iOS 13 - 0.40000000596046448 真
有人遇到过吗?
这不是错误。事实上,在小数点后很多位(在本例中为 16 位)之后,它预计是不准确的。浮点数是通过 IEEE 754 单精度浮点运算标准计算的。原始标准仅精确到 7 decimal places for integers between 4 and 6, but this has iteratively improved since the original, for example in 2019 and 2020 (see here 以了解详细信息)。
你看到的应该是条件投射的效果吧。从 Float
到 CGFloat
的转换失去了精度。