iOS UIFont字型大小適配,利用類別寫簡單的runtime替換方法
阿新 • • 發佈:2019-02-17
通常我們不做字型大小的適配,但有時候需求要你在不同尺寸螢幕上顯示合適的字型大小,如果你用的系統字型大小方法systemFontOfSize:,那麼可以寫一個類別,然後什麼都不用做,自動替換所有字型大小。
當然,此方法也適合替換其他方法,比如替換imageNamed:,可參考:http://blog.csdn.net/baidu_31326173/article/details/51590824
寫一個UIFont類別
.h方法:
.m方法:#import <UIKit/UIKit.h> #import <objc/runtime.h> #define IS_IPHONE_6 ([[UIScreen mainScreen] bounds].size.height == 667.0f) #define IS_IPHONE_6_PLUS ([[UIScreen mainScreen] bounds].size.height == 736.0f) // 這裡設定iPhone6放大的字號數(現在是放大2號,也就是iPhone4s和iPhone5上字型為15時,iPhone6上字號為17) #define IPHONE6_INCREMENT 2 // 這裡設定iPhone6Plus放大的字號數(現在是放大3號,也就是iPhone4s和iPhone5上字型為15時,iPhone6上字號為18) #define IPHONE6PLUS_INCREMENT 3 @interface UIFont (adapt) +(UIFont *)adjustFont:(CGFloat)fontSize; @end
#import "UIFont+adapt.h" @implementation UIFont (adapt) +(void)load{ //獲取替換後的類方法 Method newMethod = class_getClassMethod([self class], @selector(adjustFont:)); //獲取替換前的類方法 Method method = class_getClassMethod([self class], @selector(systemFontOfSize:)); //然後交換類方法 method_exchangeImplementations(newMethod, method); } +(UIFont *)adjustFont:(CGFloat)fontSize{ UIFont *newFont=nil; if (IS_IPHONE_6){ newFont = [UIFont adjustFont:fontSize + IPHONE6_INCREMENT]; }else if (IS_IPHONE_6_PLUS){ newFont = [UIFont adjustFont:fontSize + IPHONE6PLUS_INCREMENT]; }else{ newFont = [UIFont adjustFont:fontSize]; } return newFont; } @end
- load方法只會走一次,利用runtime的method進行方法的替換
- 替換的方法裡面(把系統的方法替換成我們自己寫的方法),這裡要記住寫自己的方法,不然會死迴圈
- 之後凡是用到systemFontOfSize方法的地方,都會被替換成我們自己的方法,即可改字型大小了
- 注意:此方法只能替換 純程式碼 寫的控制元件字號,如果你用xib建立的控制元件且在xib裡面設定的字號,那麼替換不了!你需要在xib的
awakeFromNib方法裡面手動設定下控制元件字型