Puede utilizar el capHeight de la fuente.
C objetivo
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)
La imagen adjunta se representa en la línea de base del texto. Y el eje y está invertido como el sistema de coordenadas de los gráficos centrales. Si desea mover la imagen hacia arriba, establezca bounds.origin.y
en positivo.
La imagen debe alinearse verticalmente en el centro con el capHeight del texto. Así que necesitamos configurar el bounds.origin.y
to (capHeight - imageHeight)/2
.
Para evitar algún efecto irregular en la imagen, debemos redondear la parte fraccionaria de la y. Pero las fuentes y las imágenes suelen ser pequeñas, incluso una diferencia de 1 px hace que la imagen parezca desalineada. Entonces apliqué la función redonda antes de dividir. Hace que la fracción sea parte del valor de y en .0 o .5
En su caso, la altura de la imagen es mayor que la altura capHeight de la fuente. Pero puedes usar la misma forma. El valor de la compensación y será negativo. Y se presentará desde abajo de la línea de base.