在 NSMutableAttributedString 中垂直对齐 NSTextAttachment

FS.*_*.O6 10 nsattributedstring uilabel ios swift

我添加一个图标到UILabel使用NSTextAttachment中的NSMutableAttributedString是这样的:

//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()
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

War*_*shi 19

使用 的bounds属性NSTextAttachment

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

let imageSize = moneyIcon.image!.size
moneyIcon.bounds = CGRect(x: CGFloat(0), y: (font.capHeight - imageSize.height) / 2, width: imageSize.width, height: imageSize.height)

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()
Run Code Online (Sandbox Code Playgroud)


Tam*_*gel 13

这个答案是关于将两种不同大小的字体垂直居中在一个单一的NSAttributedString,提到使用基线偏移来计算字符串的中心。

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

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

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

此代码涵盖了大多数情况,如果您的字体行为不同,您应该查看Text Kit 中管理文本的指南

// *Setting up icon*

let moneyIcon = NSTextAttachment()

// If you're sure a value is not and will never be nil, you can use "!".
// Otherwise, avoid it.

let moneyImage = UIImage(named: "MoneyIcon")!

moneyIcon.image = moneyImage
let moneyIconString = NSAttributedString(attachment: moneyIcon)

// *Setting up NSAttributedString attributes*

let balanceFontSize: CGFloat = 16

let balanceFont = UIFont(name: "Baloo", size: balanceFontSize)!

let balanceBaselineOffset: CGFloat = {
    let dividend =  moneyImage.size.height - balanceFontSize

    return dividend / 2 - balanceFont.descender / 2
}()

let balanceAttr: [NSAttributedString.Key: Any] = [
    .font: balanceFont,
    .baselineOffset: balanceBaselineOffset
]

// *Setting up text*

let balanceString = NSMutableAttributedString(
    string: " 1,702,200",
    attributes: balanceAttr
)

balanceString.insert(moneyIconString, at: 0)
Run Code Online (Sandbox Code Playgroud)