banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[iOS] UILabelの自動トリム機能を無効にし、空白文字や改行などの空白文字を削除する

iOS7.0 以降の UILabel は、テキストの末尾の空白文字を自動的に削除します。半角スペース(\0x20)やタブ(\t)などの一般的な空白文字だけでなく、全角スペース(\u3000)や余分な改行文字(\r、\n)も自動的に削除されます。これにより、コントロールに値を割り当てる際に値を取得してトリムする必要がなくなりますが、あまりにもスマートすぎて、いくつかの簡単に実現できる要件を満たすことができません。

要件 1. テキストの上下に連続した空白行を追加するために \n を使用し、テキストの行間を 2 倍にする。
iOS7.0 以前の解決策:改行文字の後にスペースを追加します。
以下のように表示する場合:

aaaaaaa
空行
空行
bbbbbb

以下の形式でテキストを割り当てます。

lbl.text = @"aaaaaaa\n\u0020\n\u0020bbbbbb";

iOS7.0 以降では、追加する必要があります。追加しないと効果がありません。

lbl.numberOfLines = 0; // 0 は行数が固定されていないことを示します
lbl.lineBreakMode=UILineBreakModeWordWrap; // 改行を許可します(オプション)

要件 2. すべての UILabel のテキストの後にスペースを追加し、テキストを右揃えにする。
iOS7.0 以前の解決策:テキストの前にスペースを追加します。

lbl.text = [NSString stringWithFormat:@"%@%@","aaaaa","\u0020"];

iOS7.0 以降では、UILabel の drawTextInRect メソッドをオーバーライドし、デフォルトのテキスト描画 Rect の幅を半分のフォントの幅に短縮することで実現します。
具体的な実装コードは以下の通りです:
ファイル名:MyLabel.h

#import @interface MyLabel : UILabel
@end

ファイル名:MyLabel.m

#import "MyLabel.h"

@implementation MyLabel
-(id) initWithFrame:(CGRect)frame {
self = [super initWithFrame];
if(self){
return self;
}
}

-(void) drawTextInRect:(CGRect)rect {
// テキストの描画 Rect の幅をフォントの幅の半分に短縮する
//self.font.pointSize / 2
return [super drawTextInRect(rect.origin.x, rect.origin.y, rect.size.width - self.font.pointSize / 2, rect.size.height)];
}
@end

付録:
UILabel が自動的にクリアする空白文字(UNICODE)
\u0009 CHARACTER TABULATION
\u000A LINE FEED
\u000D CARRIAGE RETURN
\u0020 SPACE
\u0085 NEXT LINE
\u00A0 NBSP
\u1680 OGHAM SPACE MARK
\u180E MONGOLIAN VOWEL SEPARATOR
\u2000 EN QUAD
\u200A HAIR SPACE
\u200B ZERO WIDTH SPACE
\u2028 LINE SEPARATOR
\u2029 PARAGRAPH SEPARATOR
\u202F NARROW NO-BREAK SPACE
\u205F MEDIUM MATHEMATICAL SPACE
\u3000 IDEOGRAPHIC SPACE

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。