在NSMutableAttributedString中垂直对齐NSTextAttachment

时间:2017-12-16 10:34:35

标签: ios swift uilabel nsattributedstring

我在UILabel内使用NSTextAttachmentNSMutableAttributedString添加了一个图标,如下所示:

//Setting up icon
let moneyIcon = NSTextAttachment()
moneyIcon.image = UIImage(named: "MoneyIcon")
let moneyIconString = NSAttributedString(attachment: moneyIcon)

//Setting up text
let balanceString = NSMutableAttributedString(string: " 1,702,200")
balanceString.insert(moneyIconString, at: 0)

//Adding string to label
self.attributedText = balanceString
self.sizeToFit()

但由于某种原因,图标没有垂直对齐

有人知道我该如何对齐它?

谢谢!

2 个答案:

答案 0 :(得分:3)

This answer,关于在一个NSAttributedString中垂直居中两个不同大小的字体,提到使用基线偏移来计算字符串的中心。

使用图像时可以使用相同的方法:

  1. 从图像的高度减去字体大小并除以2。

  2. 从值中减去字体的下划线(因为字体大小与字体的上升不同)。您特别使用的字体( Baloo-Regular )的下降值与标准不同,应除以2.其他字体(包括San Fransisco)不需要修复或要求不同的除数。

  3. 此代码涵盖了大多数情况,如果您的字体行为不同,则应该查看the guide for managing texts in Text Kit

    let moneyImage = UIImage(named: "MoneyIcon")!
    
    //Setting up icon
    let moneyIcon = NSTextAttachment()
    moneyIcon.image = moneyImage
    let moneyIconString = NSAttributedString(attachment: moneyIcon)
    
    let balanceFontSize: CGFloat = 16
    let balanceFont = UIFont(name: "Baloo", size: balanceFontSize)
    
    //Setting up font and the baseline offset of the string, so that it will be centered
    let balanceAttr: [NSAttributedStringKey: Any] = [.font: balanceFont,
                                                     .baselineOffset: (moneyImage.size.height - balanceFontSize) / 2 - balanceFont.descender / 2]
    
    //Setting up text
    let balanceString = NSMutableAttributedString(string: " 1,702,200", attributes: balanceAttr)
    balanceString.insert(moneyIconString, at: 0)
    

    Here is a GitHub project where you can try out this code.

答案 1 :(得分:0)

使用bounds的{​​{1}}属性。

NSTextAttachment