用戶界面是沒法從一個單獨的圖片裏面構建的。一個設計良好的圖標可以很好地表現一個按鈕或控件的意圖,不過你早晚都要須要一個不錯的老式風格的文本標籤。 git
若是你想在一個圖層裏面顯示文字,徹底能夠藉助圖層代理直接將字符串使用Core Graphics寫入圖層的內容(這就是UILabel的精髓)。若是越過寄宿於圖層的視圖,直接在圖層上操做,那其實至關繁瑣。你要爲每個顯示文字的圖層建立一個能像圖層代理同樣工做的類,還要邏輯上判斷哪一個圖層須要顯示哪一個字符串,更別提還要記錄不一樣的字體,顏色等一系列亂七八糟的東西。 github
萬幸的是這些都是沒必要要的,Core Animation提供了一個CALayer的子類CATextLayer,它以圖層的形式包含了UILabel幾乎全部的繪製特性,而且額外提供了一些新的特性。 api
一樣,CATextLayer也要比UILabel渲染得快得多。不多有人知道在iOS 6及以前的版本,UILabel實際上是經過WebKit來實現繪製的,這樣就形成了當有不少文字的時候就會有極大的性能壓力。而CATextLayer使用了Core text,而且渲染得很是快。 app
讓咱們來嘗試用CATextLayer來顯示一些文字。清單6.2的代碼實現了這一功能,結果如圖6.2所示。 性能
清單6.2 用CATextLayer來實現一個UILabel 字體
@interface ViewController () @property (nonatomic, weak) IBOutlet UIView *labelView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //create a text layer CATextLayer *textLayer = [CATextLayer layer]; textLayer.frame = self.labelView.bounds; [self.labelView.layer addSublayer:textLayer]; //set text attributes textLayer.foregroundColor = [UIColor blackColor].CGColor; textLayer.alignmentMode = kCAAlignmentJustified; textLayer.wrapped = YES; //choose a font UIFont *font = [UIFont systemFontOfSize:15]; //set layer font CFStringRef fontName = (__bridge CFStringRef)font.fontName; CGFontRef fontRef = CGFontCreateWithFontName(fontName); textLayer.font = fontRef; textLayer.fontSize = font.pointSize; CGFontRelease(fontRef); //choose some text NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing \ elit. Quisque massa arcu, eleifend vel varius in, facilisis pulvinar \ leo. Nunc quis nunc at mauris pharetra condimentum ut ac neque. Nunc elementum, libero ut porttitor dictum, diam odio congue lacus, vel \ fringilla sapien diam at purus. Etiam suscipit pretium nunc sit amet \ lobortis"; //set layer text textLayer.string = text; } @end
圖6.2 用CATextLayer來顯示一個純文本標籤 ui
若是你仔細看這個文本,你會發現一個奇怪的地方:這些文本有一些像素化了。這是由於並無以Retina的方式渲染,第二章提到了這個contentScale屬性,用來決定圖層內容應該以怎樣的分辨率來渲染。contentsScale並不關心屏幕的拉伸因素而老是默認爲1.0。若是咱們想以Retina的質量來顯示文字,咱們就得手動地設置CATextLayer的contentsScale屬性,以下: atom
textLayer.contentsScale = [UIScreen mainScreen].scale;
這樣就解決了這個問題(如圖6.3) spa
圖6.3 設置contentsScale來匹配屏幕 設計
CATextLayer的font屬性不是一個UIFont類型,而是一個CFTypeRef類型。這樣能夠根據你的具體須要來決定字體屬性應該是用CGFontRef類型仍是CTFontRef類型(Core Text字體)。同時字體大小也是用fontSize屬性單獨設置的,由於CTFontRef和CGFontRef並不像UIFont同樣包含點大小。這個例子會告訴你如何將UIFont轉換成CGFontRef。
另外,CATextLayer的string屬性並非你想象的NSString類型,而是id類型。這樣你既能夠用NSString也能夠用NSAttributedString來指定文本了(注意,NSAttributedString並非NSString的子類)。屬性化字符串是iOS用來渲染字體風格的機制,它以特定的方式來決定指定範圍內的字符串的原始信息,好比字體,顏色,字重,斜體等。