NSTextAttachment 画像を一行の UILabel の横に中央に配置する 質問する

NSTextAttachment 画像を一行の UILabel の横に中央に配置する 質問する

NSTextAttachment属性付き文字列に画像を追加し、垂直方向に中央揃えにしたいと思います。

文字列を作成するために次のコードを使用しました。

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:DDLocalizedString(@"title.upcomingHotspots") attributes:attrs];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [[UIImage imageNamed:@"help.png"] imageScaledToFitSize:CGSizeMake(14.f, 14.f)];
cell.textLabel.attributedText = [str copy];

ただし、画像はセルの上部に揃っているように見えますtextLabel

テキスト添付オフセット問題のスクリーンショット

添付ファイルが描画される四角形を変更するにはどうすればよいですか?

ベストアンサー1

フォントの 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 の小数部分を四捨五入する必要があります。しかし、フォントや画像は通常小さいため、1 ピクセルの違いでも画像がずれて見えます。そこで、分割する前に round 関数を適用しました。これにより、y 値の小数部分が .0 または .5 になります。

あなたの場合、画像の高さはフォントの capHeight よりも大きいです。しかし、同じ方法を使用できます。オフセット y 値は負になります。そして、ベースラインの下からレイアウトされます。

ここに画像の説明を入力してください

参考文献:

Apple開発者iOS 向けテキスト プログラミング ガイド

おすすめ記事