您可以使用字体的 capHeight。
Objective-C
NSTextAttachment *icon = [[NSTextAttachment alloc] init];
UIImage *iconImage = [UIImage imageNamed:@"icon.png"];
[icon setBounds:CGRectMake(0, roundf(titleFont.capHeight - iconImage.size.height)/2.f, iconImage.size.width, iconImage.size.height)];
[icon setImage:iconImage];
NSAttributedString *iconString = [NSAttributedString attributedStringWithAttachment:icon];
[titleText appendAttributedString:iconString];
Swift
let iconImage = UIImage(named: "icon.png")!
var icon = NSTextAttachment()
icon.bounds = CGRect(x: 0, y: (titleFont.capHeight - iconImage.size.height).rounded() / 2, width: iconImage.size.width, height: iconImage.size.height)
icon.image = iconImage
let iconString = NSAttributedString(attachment: icon)
titleText.append(iconString)
附件图像呈现在文本的基线上。
并且它的y轴与核心图形坐标系一样是反转的。
如果要将图像向上移动,请设置bounds.origin.y
为积极。
图像应与文本的 capHeight 垂直居中对齐。
所以我们需要设置bounds.origin.y
to (capHeight - imageHeight)/2
.
为了避免对图像产生锯齿效果,我们应该对 y 的小数部分进行舍入。但字体和图像通常都很小,即使是 1px 的差异也会使图像看起来像是未对齐。所以我在除法之前应用了舍入函数。它将 y 值的小数部分变为 0.0 或 0.5
在您的情况下,图像高度大于字体的 capHeight。但你可以用同样的方法。偏移 y 值将为负。它将从基线下方开始布局。
参考:
苹果开发者iOS 文本编程指南 https://developer.apple.com/library/archive/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/Introduction/Introduction.html