我在字符串中设置一个字体,字体较小,大约是原始字体的一半,如下所示:
// string is "30:00.0"
func getTime(string:String) -> NSMutableAttributedString {
let attributedString = NSMutableAttributedString(string:string)
let smallFont = UIFont(name:SPConstants.FontName, size:SPConstants.FontSizeDashboardSmall)!
let baselineOffset = bigLabel.font.capHeight - smallFont.capHeight
let decimalRange:NSRange = (timeString as NSString).range(of: ".")
let superscriptRange = NSRange(location:decimalRange.location, length:(timeString.characters.count - decimalRange.location))
let attributes = [
NSBaselineOffsetAttributeName:baselineOffset,
NSFontAttributeName:smallFont
] as [String : Any]
attributedString.addAttributes(attributes, range:superscriptRange)
// attributedString.setAttributes(attributes, range:superscriptRange)
return attributedString
}
以下是最初呈现的内容:
以下是最初的样子,但只有在用户操作触发布局传递后才会出现这种情况:
Attributed string after layout pass
奇怪的是,基线属性立即应用,但小字体大小不是。然后在布局传递后应用这两个属性。
a)创建归属字符串并将其分配给第一张图片中的UILabel attributedText。
b)点击一个按钮,并使用新的属性字符串重置标签。新字符串也具有初始值“30:00.0”,这是第二个图像。此时正在纠正渲染。
c)计时器启动,每10秒钟减少1/10并更新标签。渲染也是正确的。
fileprivate lazy var bigLabel:UILabel = {
var label = UILabel.newAutoLayout()
label.textAlignment = NSTextAlignment.center
label.font = UIFont(name:SPConstants.FontName, size:SPConstants.FontSizeDashboardBig)
return label
}()
. . .
bigLabel.attributedText = getTime(string:"30:00.0")
任何想法如何解决?
更新
将其缩小为扩展名,该扩展名用于全局设置相同的字体。
extension UILabel {
@objc public var substituteFontName : String {
get {
return self.font.fontName
}
set {
var fontName = newValue
self.font = UIFont(name: fontName, size: self.font.pointSize)
}
}
}
在AppDelegate的应用程序中:didFinishLaunchingWithOptions
UILabel.appearance().substituteFontName = SPConstants.FontName
更新2
实现扩展setter必须影响它。为了解决这个问题,我创建了一个子类SPLabel并检查setter中的类类型。我得到了所需的结果。
fileprivate lazy var bigLabel:SPLabel = {
. . .
set {
if !(self is SPLabel) {
self.font = UIFont(name:newValue, size: self.font.pointSize)
}
}