NSFontAttributeName的大小未应用于NSAttributedString

时间:2017-11-15 21:49:54

标签: swift nsattributedstring

我在字符串中设置一个字体,字体较小,大约是原始字体的一半,如下所示:

// 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

以下是最初的样子,但只有在用户操作触发布局传递后才会出现这种情况:

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)
    }
}

0 个答案:

没有答案