iOS 14和Simulator UILabel extension padding bug
iOS 14 and Simulator UILabel extension padding bug
我在项目的很多地方使用这个 UILabel 扩展来填充标签。它在 iOS 13 和更旧版本的设备上完美运行。但它在 iOS 14 台设备和模拟器上根本不起作用。我怎样才能至少在 iOS 14 上解决这个问题?
我几年前从这个答案中找到了这个解决方案:
这是我的代码:
extension UILabel {
private struct AssociatedKeys {
static var padding = UIEdgeInsets()
}
public var padding: UIEdgeInsets? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.padding) as? UIEdgeInsets
}
set {
if let newValue = newValue {
objc_setAssociatedObject(self, &AssociatedKeys.padding, newValue as UIEdgeInsets?, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
override open func draw(_ rect: CGRect) {
if let insets = padding {
self.drawText(in: rect.inset(by: insets))
} else {
self.drawText(in: rect)
}
}
override open var intrinsicContentSize: CGSize {
guard let text = self.text else { return super.intrinsicContentSize }
var contentSize = super.intrinsicContentSize
var textWidth: CGFloat = frame.size.width
var insetsHeight: CGFloat = 0.0
if let insets = padding {
textWidth -= insets.left + insets.right
insetsHeight += insets.top + insets.bottom
}
let newSize = text.boundingRect(with: CGSize(width: textWidth, height: CGFloat.greatestFiniteMagnitude),
options: NSStringDrawingOptions.usesLineFragmentOrigin,
attributes: ([.font: self.font ?? UIFont.systemFont(ofSize: 15)]), context: nil)
contentSize.height = ceil(newSize.size.height) + insetsHeight
return contentSize
}
}
很奇怪,但我找到了解决办法。当 Xcode 12 确实取消选择“调试可执行文件”时,此代码适用于模拟器和 iOS 14 设备。
在Xcode12中,我取消了“Debug executable”部分的选择,因为有时编译会花费很长时间。这样我就注意到我的填充代码正在工作。这很有趣,但现在,我将在发布应用程序时以这种方式使用它。
解决方案是取消选择:
Product -> Scheme -> Edit Scheme ... -> Run -> Info -> Debug
executable
我在项目的很多地方使用这个 UILabel 扩展来填充标签。它在 iOS 13 和更旧版本的设备上完美运行。但它在 iOS 14 台设备和模拟器上根本不起作用。我怎样才能至少在 iOS 14 上解决这个问题?
我几年前从这个答案中找到了这个解决方案:
这是我的代码:
extension UILabel {
private struct AssociatedKeys {
static var padding = UIEdgeInsets()
}
public var padding: UIEdgeInsets? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.padding) as? UIEdgeInsets
}
set {
if let newValue = newValue {
objc_setAssociatedObject(self, &AssociatedKeys.padding, newValue as UIEdgeInsets?, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
override open func draw(_ rect: CGRect) {
if let insets = padding {
self.drawText(in: rect.inset(by: insets))
} else {
self.drawText(in: rect)
}
}
override open var intrinsicContentSize: CGSize {
guard let text = self.text else { return super.intrinsicContentSize }
var contentSize = super.intrinsicContentSize
var textWidth: CGFloat = frame.size.width
var insetsHeight: CGFloat = 0.0
if let insets = padding {
textWidth -= insets.left + insets.right
insetsHeight += insets.top + insets.bottom
}
let newSize = text.boundingRect(with: CGSize(width: textWidth, height: CGFloat.greatestFiniteMagnitude),
options: NSStringDrawingOptions.usesLineFragmentOrigin,
attributes: ([.font: self.font ?? UIFont.systemFont(ofSize: 15)]), context: nil)
contentSize.height = ceil(newSize.size.height) + insetsHeight
return contentSize
}
}
很奇怪,但我找到了解决办法。当 Xcode 12 确实取消选择“调试可执行文件”时,此代码适用于模拟器和 iOS 14 设备。
在Xcode12中,我取消了“Debug executable”部分的选择,因为有时编译会花费很长时间。这样我就注意到我的填充代码正在工作。这很有趣,但现在,我将在发布应用程序时以这种方式使用它。
解决方案是取消选择:
Product -> Scheme -> Edit Scheme ... -> Run -> Info -> Debug executable