Możesz użyć capHeight czcionki.
Cel 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];
Szybki
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)
Obraz załącznika jest renderowany na linii bazowej tekstu. Jego oś y jest odwrócona, podobnie jak układ współrzędnych grafiki rdzenia. Jeśli chcesz przesunąć obraz w górę, ustaw bounds.origin.y
pozytyw.
Obraz powinien być wyrównany w pionie do środka z górną wysokością tekstu. Więc musimy ustawić bounds.origin.y
to (capHeight - imageHeight)/2
.
Unikając efektu postrzępienia na obrazie, powinniśmy zaokrąglić część ułamkową y. Ale czcionki i obrazy są zwykle małe, nawet różnica 1 piksela sprawia, że obraz wygląda na źle wyrównany. Więc zastosowałem funkcję zaokrąglania przed podzieleniem. Sprawia, że ułamek jest częścią wartości y na .0 lub .5
W twoim przypadku wysokość obrazu jest większa niż capHeight czcionki. Ale możesz użyć tego samego sposobu. Wartość przesunięcia y będzie ujemna. I zostanie to ułożone od dołu linii bazowej.