您可以使用字体的capHeight。
目标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];
迅速
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
为(capHeight - imageHeight)/2
。
为避免对图像产生锯齿状影响,我们应将y的分数部分取整。但是字体和图像通常很小,即使1px的差异也会使图像看起来像是未对齐的。所以我在除法之前应用了round函数。它将y值的小数部分设为.0或.5
在您的情况下,图像高度大于字体的capHeight。但是您可以使用相同的方式。偏移y值将为负。它将从基线的下方进行布局。