之前做模擬鎖屏界面展示時間的時候构捡,會發(fā)現(xiàn)其中的冒號會在ios7系統(tǒng)下變成方冒號秸妥,后來同事說可以借用UIFont的fontDescriptor來解決這個問題奏路,而這個fontDescriptor是在蘋果大大在介紹TextKit中提出篓吁,下面介紹下TextKit相關知識滑臊。
介紹
在ios7中引入了TextKit
Text Kit指的是UIKit框架中用于提供高質(zhì)量排版服務的一些類和協(xié)議,它讓程序能夠存儲弃榨,排版和顯示文本信息菩收,并支持排版所需要的所有特性,包括字距調(diào)整鲸睛、連寫娜饵、換行和對齊等。
如下圖可以看到其所處位置(圖片來自官方文檔)
Text Kit主要的對象如下圖(圖片來自官方文檔)官辈,
Text views對應UITextView類箱舞,用于展示文本內(nèi)容;
在 TextKit 中拳亿,文本視圖有兩個目的:第一褐缠,它是文本系統(tǒng)用來繪制的視圖。文本視圖它自己并不會做任何繪制风瘦;它僅僅提供一個供其它類繪制的區(qū)域队魏。作為視圖層級機構(gòu)中唯一的組件,第二個目的是處理所有的用戶交互万搔。具體來說胡桨,文本視圖實現(xiàn) UITextInput 的協(xié)議來處理鍵盤事件,它為用戶提供了一種途徑來設置一個插入點或選擇文本瞬雹。它并不對文本做任何實際上的改變昧谊,僅僅將這些改變請求轉(zhuǎn)發(fā)給剛剛討論的文本存儲。
Text containers對應NSTextContainer類酗捌,用于定義文本置于哪一塊呢诬,通常其是一個矩形區(qū)域,你也可以自定義成其他形狀胖缤;
Layout manager對應NSLayoutManager類尚镰,用于對文本版面布局;
Text storage對應NSTextStorage類哪廓,其是NSMutableAttributedString的子類狗唉,用于存儲文本內(nèi)容,同時它也管理一系列NSLayoutManager對象涡真,當文本的屬性或字符發(fā)生變化的時候分俯,通知NSLayoutManager對象重新布局和展示肾筐。
Text kit 常用的功能列舉
1.對文字進行分頁或多列排版
2.支持文字的換行、折疊和著色等處理
3.可以調(diào)整字與字之間的距離缸剪、行間距吗铐、文字大小、指定特定的字體
4.支持富文本編輯杏节,可以自定義文字截斷
5.支持凸版印刷效果(letterpress)
6.支持數(shù)據(jù)類型的檢測(例如鏈接唬渗、附件等)
字體相關
- 系統(tǒng)原生字體
一般沒有特殊字體的要求,我們會用如下設定特定大小的文本
[UIFont systemFontOfSize:xx];
但是除此之外拢锹,可能也會需要加上格外的字體格式谣妻,可以用如下代碼查看系統(tǒng)提供的字體格式有哪些萄喳,也可以訪問ios字體預覽
//系統(tǒng)提供所有字體家族名
[UIFont familyNames];
//每個字體家族名下各個字體名稱
[[UIFont fontNamesForFamilyName:[[UIFont familyNames] objectAtIndex:section]]
//應用某個字體
UIFont *font = [UIFont fontWithName:@"HelveticaNeue-BoldItalic" size:20];
-
動態(tài)字體
在設置->通用->輔助功能->更大字體卒稳,打開開關,點擊進入可以調(diào)整字體大小他巨,系統(tǒng)中字體會隨之更改
如果想要讓你的應用中字體大小也能隨著系統(tǒng)設置而改變充坑,可以通過如下代碼,建議動態(tài)字體和自動布局結(jié)合起來使用
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
但是如果程序在運行時染突,用戶切換到設置里修改了字體捻爷,這是在切回程序,字體并不會自動跟著變份企。這時就需要我們自己來更新一下控件的字體了也榄。
在系統(tǒng)字體修改時,系統(tǒng)會給運行中的程序發(fā)送UIContentSizeCategoryDidChangeNotification通知司志,我們只需要監(jiān)聽這個通知甜紫,并重新設置一下字體即可。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(preferredContentSizeChanged:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
-(void)preferredContentSizeChanged:(NSNotification *)notification{
self.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
}
文本常量 | 用處 |
---|---|
UIFontTextStyleHeadline | headings |
UIFontTextStyleBody | body text |
UIFontTextStyleSubheadline | subheads |
UIFontTextStyleFootnote | footnotes |
UIFontTextStyleCaption1 | standard captions |
UIFontTextStyleCaption2 | alternate captions |
3.字體描述符
即UIFontDescriptor骂远,通過定義字體的一系列屬性來創(chuàng)建UIFont對象囚霸,你可以從font descriptor獲取到一個font對象,也可以從font對象中得到一個font descriptor激才,因此你可以通過更改font descriptor得到一個新的font對象拓型。
你可以通過font descriptor獲取到font family name下的所有font
UIFontDescriptor *helveticaNeueFamily = [UIFontDescriptor fontDescriptorWithFontAttributes:@{ UIFontDescriptorFamilyAttribute: @"Helvetica Neue" }];
NSArray *matches = [helveticaNeueFamily matchingFontDescriptorsWithMandatoryKeys: nil];
matches返回系統(tǒng)下所有與Helvetica Neue有關的字體
HelveticaNeue,
HelveticaNeue-Medium,
HelveticaNeue-Light,
HelveticaNeue-Thin
動態(tài)字體也可以用font descriptor來定義,還可以定義symbolic traits(bold,italic,expanded,condensed)瘸恼,具體如下
UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle: UIFontTextStyleBody];
UIFontDescriptor *boldFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits: UIFontDescriptorTraitBold];
UIFont *boldFont = [UIFont fontWithDescriptor: boldFontDescriptor size: 0.0];
//size為0劣挫,因為這邊是動態(tài)字體,是隨著系統(tǒng)設置變化
再介紹一個官方講解應用font descriptor設置時間展示
我們需要的是下面的那種格式东帅,代碼如下
NSArray *timeFeatureSettings = @[
@{
UIFontFeatureTypeIdentifierKey: @(kNumberSpacingType),
UIFontFeatureSelectorIdentifierKey: @(kProportionalNumbersSelector)
},
@{
UIFontFeatureTypeIdentifierKey: @(kCharacterAlternativesType),
UIFontFeatureSelectorIdentifierKey: @(1)
}];
UIFont *font = [UIFont systemFontOfSize:20];
UIFontDescriptor *originalDescriptor = [font fontDescriptor];
UIFontDescriptor *timeDescriptor = [originalDescriptor fontDescriptorByAddingAttributes: @{UIFontDescriptorFeatureSettingsAttribute:timeFeatureSettings }];
UIFont *timeFont = [UIFont fontWithDescriptor: timeDescriptor
size: 0.0];
引入外部字體
- 字體文件后綴是ttf,ttc,otf,otc
- 在app bundle中添加
a.將字體文件放入項目中;
b.修改plist文件揣云,添加Fonts provided by application 配置,在其中添加item體文件名帶后綴;
c.可以在圖形化界面看到新的字體選擇冰啃,或者像前面那樣獲取所有字體名稱邓夕,查看是不是有新添加的 - 手動添加
CTFontManagerRegisterFontsForURL()
CTFontManagerRegisterFontsForURLs()
CTFontManagerRegisterGraphicsFont()
CTFontManagerCreateFontDescriptorsFromURL()
CTFontManagerCreateFontDescriptorFromData()
圖文混排
利用textContainer的exclusion paths可以做到像word中文字環(huán)繞在圖片周圍刘莹;
-(UIBezierPath *)translatedBezierPath
{
CGRect butterflyImageRect = [textView convertRect:imageView.frame fromView:self.view];
UIBezierPath *newButterflyPath = [UIBezierPath bezierPathWithRect:butterflyImageRect];
return newButterflyPath;
}
textView = [[UITextView alloc]initWithFrame:CGRectMake(20, 40, [UIScreen mainScreen].bounds.size.width - 40, [UIScreen mainScreen].bounds.size.height - 40)];
textView.font = [UIFont systemFontOfSize:18];
textView.text = @"在排版中,圖文混排是非常常見的需求焚刚,但有時候我們的圖片并一定都是正常的矩形点弯,這個時候我們?nèi)绻枰獙⑽谋经h(huán)繞在圖片周圍,就可以用路徑排除了矿咕。Explosion pats基本原理是將需要被文本留出來的形狀的路徑告訴文本控件的NSTextContainer對象抢肛,NSTextContainer在文字排版時就會避開該路徑。";//設置它顯示的內(nèi)容
imageView = [[UIImageView alloc ] init];
imageView.frame = CGRectMake(80, 80, 100, 100);
imageView.backgroundColor = [UIColor redColor];
UIImage *image = [UIImage imageNamed:@"0.jpeg"];
imageView.image = image;
[self.view addSubview:textView];
[self.view addSubview:imageView];
textView.textContainer.exclusionPaths = @[[self translatedBezierPath]];
運行之后碳柱,就會得到如下效果
參考資料
Using Text Kit to Draw and Manage Text
Using Fonts with Text Kit
Using Fonts with Text Kit PPT講解
Text Kit入門
淺析Text Kit
了解ios字體相關知識
ios字體預覽
Core Text Font Manager Reference