iOS文字大小自適應庫(MBFontAdapter)誕生記,iosmbfontadapter
背景
什麼是iOS文字大小自適應?單純回答這個問題實在太困難…所以講一個故事,就很好理解了:
某天做UI設計的妹子弱弱地問我:“我們的app可不可以實現文字的字型大小在iPhone6上和iPhone6Plus上比iPhone4s和iPhone5大一些?如果要實現難度是不是比較大?工作量會不會增加很多?”其實當我聽到這個問題的時候,我整個人都不好了,因為目前主流的app貌似沒有這麼乾的。然而,這個時候能回答不可以嗎?能回答很難嗎?能回答工作量會增加很多嗎?能告訴UI主流app都不這麼幹嗎?顯然不能!!!於是就有了MBFontAdapter。
前提
字型大小自適應的目的只是為了更滿足UI設計的需要。簡單來說就是為了介面的美觀,所以是有幾點前提的:
思路分析storyboard內建方法
storyboard支援在不同布局方式下(Compact、Regular和Any)下設定不同的字型大小大小,如:
點擊紅框中的+號就可以添加不同布局方式時字型大小的大小
註:雖然這種方法可以單獨定製每個控制項在不同布局方式時字型大小的大小,但是太麻煩。因為我們UI的需求是每個帶文字的控制項都需要這樣設定…你能想象一個一個設定是怎樣的痛苦嗎?
我的方法
因為有文字的控制項就有那麼幾個:UILabel、UITextField、UIButton和UITextView。所以我可以繼承這幾個控制項的類,然後重載它們的一些實現方法即可。使用者在使用的時候只需要將類設定為繼承的類即可。下面就是具體的實現步驟:
第一步
當然是要Crowdsourced Security Testing道當前裝置iPhone6還是iPhone6Plus(因為根據UI的需求,她設計時字型大小都是按照iPhone5的螢幕大小來定的,所以在iPhone6上面字型大小要稍微大一點,然後iPhone6Plus上字型大小要更大一點)。代碼很簡單
#define IS_IPHONE_6 ([[UIScreen mainScreen] bounds].size.height == 667.0f)#define IS_IPHONE_6_PLUS ([[UIScreen mainScreen] bounds].size.height == 736.0f)
第二步
然後就是要確定字型大小應該變大多少(根據後面和UI的溝通,我們把iPhone6上的字型大小變大了2號,iPhone6Plus上的字型大小變大了3號)。
// 這裡設定iPhone6放大的字型大小數(現在是放大2號,也就是iPhone4s和iPhone5上字型為15時,iPhone6上字型大小為17)#define IPHONE6_INCREMENT 2// 這裡設定iPhone6Plus放大的字型大小數(現在是放大3號,也就是iPhone4s和iPhone5上字型為15時,iPhone6上字型大小為18)#define IPHONE6PLUS_INCREMENT 3
第三步
然後就是核心邏輯,我封裝了一個方法,這個方法的作用是傳入一個UIFont對象,然後根據當前裝置,將UIFont的字型大小做相應的調整,然後返回一個新的UIFont對象。代碼如下:
+(UIFont *)adjustFont:(UIFont *)font{ UIFont *newFont=nil; if (IS_IPHONE_6){ newFont = [UIFont fontWithName:font.fontName size:font.pointSize+IPHONE6_INCREMENT]; }else if (IS_IPHONE_6_PLUS){ newFont = [UIFont fontWithName:font.fontName size:font.pointSize+IPHONE6PLUS_INCREMENT]; }else{ newFont = font; } return newFont;}
第四步
然後就是控制項層的分析。
首先,控制項的產生有兩種方式,一種是通過代碼產生,還有一種是通過storyboard和xib產生。
然後就是字型的初始大小的設定問題。根據UI設計,不同的地方字型的大小肯定不一樣,所以還是要手動設定一次的,我們app的字型是完全按照UI給定的大小來設定的(只是在iPhone6和iPhone6Plus上會做相應的字型大小放大),如果是代碼產生則調用控制項setFont方法,如果是storyboard和xib則在紅框標註的位置設定字型大小即可:
然後就是重載的方法,第一個是setFont方法,代碼如下:
-(void)setFont:(UIFont *)font{ [super setFont:[MBFontAdapter adjustFont:font]];}
這樣使用者在調用.font或者setFont時就會自動對字型大小進行處理。
然後是awakeFromNib,這個方法是當控制項是由xib和storyboard產生時會調用的,思路是拿到控制項當前的font(也就是在中設定字型的地方設定的那個字型大小),然後進行處理,代碼如下:
-(void)awakeFromNib{ [super awakeFromNib]; [super setFont:[MBFontAdapter adjustFont:self.font]];}
具體的使用方法可以下載demo查看:
https://github.com/mmoaay/MBFontAdapter
註:目前已經完美支援storyboard和xib