Bạn có thể sử dụng capHeight của phông chữ.
Mục tiêu-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];
Nhanh
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)
Hình ảnh đính kèm được hiển thị trên đường cơ sở của văn bản. Và trục y của nó bị đảo ngược giống như hệ tọa độ đồ họa lõi. Nếu bạn muốn di chuyển hình ảnh lên trên, hãy đặt thành bounds.origin.y
tích cực.
Hình ảnh phải được căn giữa theo chiều dọc với độ sáng của văn bản. Vì vậy, chúng ta cần phải thiết lập bounds.origin.y
để (capHeight - imageHeight)/2
.
Để tránh một số hiệu ứng lởm chởm trên hình ảnh, chúng ta nên làm tròn phần phân số của y. Nhưng phông chữ và hình ảnh thường nhỏ, thậm chí chênh lệch 1px làm cho hình ảnh trông như bị sai lệch. Vì vậy, tôi áp dụng chức năng tròn trước khi chia. Nó làm cho phần phân số của giá trị y thành .0 hoặc .5
Trong trường hợp của bạn, chiều cao hình ảnh lớn hơn capHeight của phông chữ. Nhưng bạn có thể sử dụng cùng một cách. Giá trị offset y sẽ âm. Và nó sẽ được đặt ra từ bên dưới của đường cơ sở.