IOS で文字列を描画する場合、デフォルトでは、テキストは左上隅にベースラインが設定されます。これは、同じ y 座標でフォント サイズが異なる複数の文字列を使用する場合に問題を引き起こす可能性があります。
質問;
最初の行の左下隅で文字列のベースライン
を設定するにはどうすればよいですか。
どうすればこれを達成できますか?
ブラ、
ティム
IOS で文字列を描画する場合、デフォルトでは、テキストは左上隅にベースラインが設定されます。これは、同じ y 座標でフォント サイズが異なる複数の文字列を使用する場合に問題を引き起こす可能性があります。
質問;
最初の行の左下隅で文字列のベースライン
を設定するにはどうすればよいですか。
どうすればこれを達成できますか?
ブラ、
ティム
私は最終的に私の問題の解決策を見つけました。UIFont のアセンダー
プロパティを rect.origin.y から
差し引くことで、テキストのベースラインを左下隅に合わせることができました。
アセンダー プロパティの UIFont ドキュメントを引用します。
「レシーバーの最も長いアセンダーの、ベースラインからのオフセットの上の y 座標。」 https://developer.apple.com/library/ios/documentation/uikit/reference/UIFont_Class/Reference/Reference.html#//apple_ref/occ/instp/UIFont/ascender
- (void)drawTextBaseLined:(NSString *)text
rect:(CGRect)rect
font:(UIFont *)font
{
if ([text length] == 0) return false;
NSDictionary *attributes = @{NSFontAttributeName : font};
rect.origin.y -= font.ascender;
[text drawWithRect:rect
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attributes
context:nil];
}
この方法は、1 行または複数行のテキストとさまざまなフォント サイズで機能します。私の解決策が他の誰かにも役立つことを願っています。
ブラ、
ティム
使用する- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context;
ラベルの高さが決まったら、左下隅が常に同じ場所になるように、ラベルの正しい原点を選択するための計算を行うだけです。
NSDictionary * attributes = @{NSFontAttributeName:[UIFont systemFont]};
CGRect rect = [[NSString string] boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];
左隅の下のラベルを常に 50pix にしたい場合、ラベルの原点は (50 - rect.size.height) になります。
制約に合わせてサイズを変更します。