1. Text Kit基礎(chǔ) ?
? ? ? ? Text Kit最主要的作用 是為程序提供文字排版和渲染的功能。通過Text Kit可以對文字進行存儲垢村、布局,以更加精 的排版方式來顯示文本內(nèi)容铝宵。Text Kit屬于UIKit框架翎冲,其中包 了一些文字排版的相關(guān)類和協(xié) 。?
? ? ? ? 在iOS 7之前沒有Text Kit谨敛。文本控件究履,如:UILabel、UITextField和UITextView是基于String Drawing和WebKit構(gòu)建的脸狸。其中String Drawing與Core Graphics接通信最仑。因此在iOS 7之前文本控件也可以實現(xiàn)多種樣式的文字排版,但是事實上是通過WebKit實現(xiàn)的炊甲。WebKit是一種瀏覽器內(nèi)核技術(shù)泥彤,使用它進行文字渲染會? ? 較多的內(nèi)存,對應(yīng)用的性能有一定的? 卿啡。
? ? ? 在iOS7之后全景,UILabel、UITextfField和UITextView構(gòu)建于TextKit之上,Text Kit是基于Core Text構(gòu)建的牵囤, 通過Core Text與Core Graphics進行交 。
1.1 Text Kit中的核心類 ?
我們在使用Text Kit時滞伟,會 及如下核心類揭鳞。
1.? `NSTextContainer。定 了文本可以排版的區(qū) 梆奈。 認情況下是矩形區(qū) 野崇,如果是其它形狀的區(qū)域,需要通過子類化NSTextContainer來創(chuàng)建亩钟。`
2. `NSLayoutManager乓梨。該類負責(zé)對文字進行編 排版處理鳖轰,將存儲在NSTextStorage中的數(shù)據(jù)轉(zhuǎn)換為可以在視圖控件中顯示的文本內(nèi)容,并把字編碼映射到到對應(yīng)的字形上扶镀,然后將字形排版到NSTextContainer定義的區(qū)域中蕴侣。`
3. `NSTextStorage。主要用來存儲文本的字 和相關(guān)屬性`
4. `NSAttributedString臭觉。 持渲染不同風(fēng)格的文本昆雀。`
5. `NSMutableAttributedString◎鹬可變類 的NSAttributedString狞膘,是NSAttributedString的子類`
NSLayoutManager對象從NSTextStorage對象中取得文本內(nèi)容, 進行排版什乙,然后把排版之后的文本放到NSTextContainer對象指定的區(qū) 上挽封。最后 由一個文本控件從 NSTextContainer中取出內(nèi)容顯示到屏幕中。
1.2 凸印效果的實現(xiàn)
直接上代碼
//創(chuàng)建一個矩形區(qū)臣镣,這個區(qū)是通過CGRectInset函數(shù)創(chuàng)建的辅愿,這個函數(shù)能指定一個中
//心點,后面的兩個參數(shù)著self.view.bounds區(qū)域向內(nèi)內(nèi)進量退疫。這樣可以使得文字部分不會太靠近視圖的邊界渠缕。
CGRecttextViewRect =CGRectInset(self.view.bounds,10.0,20.0);
//主要用來存儲文本的字和相關(guān)屬性
NSTextStorage* textStorage = [[NSTextStoragealloc]initWithString:_textView.text];
//該類負責(zé)對文字進行編排版處理,將存儲在NSTextStorage中的數(shù)據(jù)轉(zhuǎn)換為可以在視圖控件中顯示的文本內(nèi)容
NSLayoutManager* layoutManager = [[NSLayoutManageralloc]init];
[textStorageaddLayoutManager:layoutManager];
//定義了文本可以排版的區(qū)
_textContainer= [[NSTextContaineralloc]initWithSize:textViewRect.size];
/**
*NSLayoutManager對象從NSTextStorage對象中取得文本內(nèi)容,進行排版褒繁,
*然后把排版之后的文本放到NSTextContainer對象指定的區(qū)域上亦鳞。
*最后由一個文本控件從NSTextContainer中取出內(nèi)容顯示到屏幕中。
*/
[layoutManageraddTextContainer:_textContainer];
[_textViewremoveFromSuperview];
_textView= [[UITextViewalloc]initWithFrame:textViewRect
textContainer:_textContainer];
_textView.textColor= [UIColoryellowColor];
_textView.editable=NO;
[self.viewaddSubview:_textView];
//設(shè)置凸印效果
[textStoragebeginEditing];
NSDictionary*attrsDic =@{NSTextEffectAttributeName:NSTextEffectLetterpressStyle};
NSMutableAttributedString*attrStr = [[NSMutableAttributedStringalloc]
initWithString:_textView.text
attributes:attrsDic];
[textStoragesetAttributedString:attrStr];
[self markWord:@"you"inTextStorage:textStorage];
[self markWord:@"I"inTextStorage:textStorage];
[self markWord:@"言"inTextStorage:textStorage];
[textStorageend Editing];
標識制定文字
- (void) markWord:(NSString*)word inTextStorage:(NSTextStorage*)textStorage{
NSRegularExpression*regex = [NSRegularExpressionregularExpressionWithPattern:word
options:0
error:nil];
NSArray*matches = [regexmatchesInString:_textView.text
options:0
range:NSMakeRange(0,[_textView.textlength])];
for(NSTextCheckingResult*matchinmatches) {
NSRangematchRange = [matchrange];
[textStorageaddAttribute:NSForegroundColorAttributeName
value:[UIColorredColor]
range:matchRange];
}
效果圖:
1.3 圖文混排
Text Kit通過環(huán)繞路徑(exclusion paths)將文字按照指定的路徑環(huán)繞在圖片等視圖對象的周圍
// 在上面代碼基礎(chǔ)上棒坏,添加一個UIImageView
// 指定NSTextContainer環(huán)繞路徑實現(xiàn)圖文混排
//設(shè)置環(huán)繞路徑燕差,可以指定多個
_textView.textContainer.exclusionPaths=@[[selftranslatedBezierPath]];
取得UIImageView的貝塞爾曲線
-(UIBezierPath*) translatedBezierPath{
//將imageView相對于View的坐標轉(zhuǎn)換為相對于textView的坐標
CGRectimageRect = [self.textViewconvertRect:_imageView.frame
fromView:self.view];
UIBezierPath*newPath = [UIBezierPathbezierPathWithRect:imageRect];
return newPath;
}
效果圖
1.4 動態(tài)字體
注冊UIContentSizeCategoryDidChangeNotification通知,實現(xiàn)動態(tài)字體功能
[[NSNotificationCenterdefaultCenter]addObserver:self
selector:@selector(preferredContentSizeChanged:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
#pragma mark --監(jiān)聽字體變化
- (void)preferredContentSizeChanged:(NSNotification*)notification{
// do something
}