Você pode usar o capHeight da fonte.
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];
Rápido
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)
A imagem do anexo é renderizada na linha de base do texto. E o eixo y dele é invertido como o sistema de coordenadas gráfico principal. Se você quiser mover a imagem para cima, defina bounds.origin.y
como positivo.
A imagem deve ser alinhada verticalmente no centro com a capHeight do texto. Portanto, precisamos definir o bounds.origin.y
para (capHeight - imageHeight)/2
.
Para evitar algum efeito irregular na imagem, devemos arredondar a parte fração de y. Mas as fontes e as imagens geralmente são pequenas, mesmo 1px de diferença faz a imagem parecer desalinhada. Então, apliquei a função round antes de dividir. Isso torna a parte da fração do valor y .0 ou .5
No seu caso, a altura da imagem é maior do que capHeight da fonte. Mas você pode usar da mesma maneira. O valor do deslocamento y será negativo. E será definido abaixo da linha de base.