Center two fonts with different different sizes vertically in an NSAttributedString

后端 未结 4 2022
一生所求
一生所求 2020-12-24 10:13

I use NSAttributedString to generate a string with two different sizes. By default, its bottom alignment looks like this:

4条回答
  •  北荒
    北荒 (楼主)
    2020-12-24 10:59

    YasT's answer in Swift:

    Swift 4

    let bigString = "BIG"
    let smallString = "Small String"
    let fullString = "\(bigString) \(smallString)"
    let string = NSMutableAttributedString(string: fullString)
    
    let bigStringRange = NSRange(location: 0, length: bigString.utf16.count)
    let smallStringRange = NSRange(location: bigStringRange.length + 1, length: smallString.utf16.count)
    
    let bigStringFontSize: CGFloat = 28
    let smallStringFontSize: CGFloat = 18
    
    string.beginEditing()
    
    string.addAttribute(.font, value: UIFont.systemFont(ofSize: bigStringFontSize), range: bigStringRange)
    string.addAttribute(.font, value: UIFont.systemFont(ofSize: smallStringFontSize), range: smallStringRange)
    string.addAttribute(.baselineOffset, value: (bigStringFontSize - smallStringFontSize) / 2, range: smallStringRange)
    
    string.endEditing()
    

    Swift 3

    let bigString = "BIG"
    let smallString = "Small String"
    let fullString = "\(bigString) \(smallString)"
    let string = NSMutableAttributedString(string: fullString)
    
    let bigStringRange = NSRange(location: 0, length: bigString.utf16.count)
    let smallStringRange = NSRange(location: bigStringRange.length + 1, length: smallString.utf16.count)
    
    let bigStringFontSize: CGFloat = 28
    let smallStringFontSize: CGFloat = 18
    
    string.beginEditing()
    
    string.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: bigStringFontSize), range: bigStringRange)
    string.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: smallStringFontSize), range: smallStringRange)
    string.addAttribute(NSBaselineOffsetAttributeName, value: (bigStringFontSize - smallStringFontSize) / 2, range: smallStringRange)
    
    string.endEditing()
    

提交回复
热议问题