iOS7.0 以後的 UILabel 會自動將 Text 行尾的空白字符全部去除,除了常見的半角空格(\0x20)和制表符 (\t) 之外,全角空格 (\u3000) 也被計算在內,甚至連多餘的換行符(\r,\n)也被自動去除了。這一點雖然方便直接將控件賦值和無需取值後再 trim,但是太過智能化了之後,往往不能滿足一些本可以簡單實現的需求。
需求 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 的 text 後增加一個空格,並使 text 右對齊。
iOS7.0 之前解決辦法:直接在 text 後增加空格即可,即 text 在賦值前增加空格。
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