1. 程式人生 > >iOS UIFont字型大小適配,利用類別寫簡單的runtime替換方法

iOS UIFont字型大小適配,利用類別寫簡單的runtime替換方法

通常我們不做字型大小的適配,但有時候需求要你在不同尺寸螢幕上顯示合適的字型大小,如果你用的系統字型大小方法systemFontOfSize:,那麼可以寫一個類別,然後什麼都不用做,自動替換所有字型大小。

當然,此方法也適合替換其他方法,比如替換imageNamed:,可參考:http://blog.csdn.net/baidu_31326173/article/details/51590824

寫一個UIFont類別

.h方法:

#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
.m方法:
#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
  1. load方法只會走一次,利用runtime的method進行方法的替換
  2. 替換的方法裡面(把系統的方法替換成我們自己寫的方法),這裡要記住寫自己的方法,不然會死迴圈
  3. 之後凡是用到systemFontOfSize方法的地方,都會被替換成我們自己的方法,即可改字型大小了
  4. 注意:此方法只能替換 純程式碼 寫的控制元件字號,如果你用xib建立的控制元件且在xib裡面設定的字號,那麼替換不了!你需要在xib的

    awakeFromNib方法裡面手動設定下控制元件字型