在NSMutableAttributedString中垂直对齐NSTextAttachment

19

我正在使用NSTextAttachment将一个图标添加到UILabel中的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()

但出于某些原因,图标没有垂直对齐

有人知道我怎么才能对齐它吗?

谢谢!


看看这个问题,它是关于两种不同大小的字体如何垂直居中在一个NSAttributedString中的,但应该能给你一些想法。 - Tamás Sengel
很遗憾,这并没有帮助。你发送的是关于字体大小的内容,而图标当然没有字体大小...还有其他想法吗? - FS.O6
你想要做什么?放置“文本”吗?那么在balanceString中使用NSBaselineOffsetAttributeName。还是放置图像?那么更改moneyIconbounds:https://dev59.com/L18e5IYBdhLWcg3wFnPm - Larme
2个回答

31

使用NSTextAttachmentbounds属性。

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

1
这个完美地运行了。我在正确设置偏移值方面遇到了问题。 - Marc Pérez
@FS.O6 这应该是被采纳的答案。它更简单,而且有效。 - mluisbrown

20

这个回答讲述了如何使不同大小的字体在单个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)

尝试通过不同的基准偏移量进行实验,以达到所期望的结果。 - Tamás Sengel
请在您的回答中包含您尝试过的代码。 - Tamás Sengel
我已经尝试了你添加的内容。我还尝试使用self.frame.size.height更改字体大小,并将“-”替换为“+”。但是都没有起作用。 - FS.O6
你能提供你正在使用的字体名称吗? - Tamás Sengel
1
是的。它是“Baloo-Regular”。大小:16 - FS.O6
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接