iOS UIFont字体大小适配,利用类别写简单的runtime替换方法

11 篇文章 0 订阅

通常我们不做字体大小的适配,但有时候需求要你在不同尺寸屏幕上显示合适的字体大小,如果你用的系统字体大小方法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方法里面手动设置下控件字体


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值