ios TextKit中font相關

之前做模擬鎖屏界面展示時間的時候构捡,會發(fā)現(xiàn)其中的冒號會在ios7系統(tǒng)下變成方冒號秸妥,后來同事說可以借用UIFont的fontDescriptor來解決這個問題奏路,而這個fontDescriptor是在蘋果大大在介紹TextKit中提出篓吁,下面介紹下TextKit相關知識滑臊。

介紹

在ios7中引入了TextKit

Text Kit指的是UIKit框架中用于提供高質(zhì)量排版服務的一些類和協(xié)議,它讓程序能夠存儲弃榨,排版和顯示文本信息菩收,并支持排版所需要的所有特性,包括字距調(diào)整鲸睛、連寫娜饵、換行和對齊等。

如下圖可以看到其所處位置(圖片來自官方文檔)


TextKit位置

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對象重新布局和展示肾筐。


TextKit主要對象

Text kit 常用的功能列舉

1.對文字進行分頁或多列排版
2.支持文字的換行、折疊和著色等處理
3.可以調(diào)整字與字之間的距離缸剪、行間距吗铐、文字大小、指定特定的字體
4.支持富文本編輯杏节,可以自定義文字截斷
5.支持凸版印刷效果(letterpress)
6.支持數(shù)據(jù)類型的檢測(例如鏈接唬渗、附件等)

字體相關

  1. 系統(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];
  1. 動態(tài)字體
    在設置->通用->輔助功能->更大字體卒稳,打開開關,點擊進入可以調(diào)整字體大小他巨,系統(tǒng)中字體會隨之更改


    調(diào)整字體大小

    如果想要讓你的應用中字體大小也能隨著系統(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];

引入外部字體

  1. 字體文件后綴是ttf,ttc,otf,otc
  2. 在app bundle中添加
    a.將字體文件放入項目中;
    b.修改plist文件揣云,添加Fonts provided by application 配置,在其中添加item體文件名帶后綴;
    c.可以在圖形化界面看到新的字體選擇冰啃,或者像前面那樣獲取所有字體名稱邓夕,查看是不是有新添加的
  3. 手動添加
    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]];

運行之后碳柱,就會得到如下效果


文字環(huán)繞圖片

參考資料

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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捡絮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子莲镣,更是在濱河造成了極大的恐慌福稳,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑞侮,死亡現(xiàn)場離奇詭異的圆,居然都是意外死亡,警方通過查閱死者的電腦和手機半火,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門越妈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钮糖,你說我怎么就攤上這事梅掠。” “怎么了店归?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵阎抒,是天一觀的道長。 經(jīng)常有香客問我娱节,道長挠蛉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任肄满,我火速辦了婚禮谴古,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稠歉。我一直安慰自己掰担,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布怒炸。 她就那樣靜靜地躺著带饱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勺疼,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天教寂,我揣著相機與錄音,去河邊找鬼执庐。 笑死酪耕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的轨淌。 我是一名探鬼主播迂烁,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼递鹉!你這毒婦竟也來了虱朵?” 一聲冷哼從身側(cè)響起垢村,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤片择,失蹤者是張志新(化名)和其女友劉穎夸研,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窜觉,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡谷炸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年北专,在試婚紗的時候發(fā)現(xiàn)自己被綠了禀挫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拓颓,死狀恐怖语婴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驶睦,我是刑警寧澤砰左,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站场航,受9級特大地震影響缠导,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溉痢,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一僻造、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孩饼,春花似錦髓削、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至梯码,卻和暖如春宝泵,著一層夾襖步出監(jiān)牢的瞬間好啰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工儿奶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坎怪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓廓握,卻偏偏與公主長得像搅窿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子隙券,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容