使用method swizzling实现根据屏幕尺寸自适应Font字体大小

主要思路:通过method swizzling进行 方法指针 指向交换 

+ (void)load{

    Method imp = class_getInstanceMethod([self class], @selector(initWithCoder:));

    Method myImp = class_getInstanceMethod([self class], @selector(myInitWithCoder:));

    method_exchangeImplementations(imp, myImp);

}

//保证程序运行,分类加载时自动执行,交换方法指针


- (id)myInitWithCoder:(NSCoder*)aDecode{

//该方法是函数指针已经交换后调用,实际上调用的是[selfinitWithCoder:]方法

    [selfmyInitWithCoder:aDecode];

    if (self) {

        //部分不像改变字体的tag值设置成123跳过

        if(self.tag !=123){

            CGFloat fontSize =self.font.pointSize;

            self.font = [UIFontsystemFontOfSize:fontSize*SizeScale];

        }

    }

    returnself;

}


//主要代码 分类UIButton(MyFont).h文件

#import <UIKit/UIKit.h>

#import <objc/runtime.h>


/**

 *  按钮

 */

@interface UIButton (MyFont)


@end


/**

 *  Label

 */

@interface UILabel (MyFont)


@end


//主要代码 分类UIButton(MyFont).m文件


#import "UIButton+MyFont.h"


//不同设备的屏幕比例(当然倍数可以自己控制)当前为等比例缩放

#define SizeScale ((g_screenHeight > 568) ? g_screenHeight/568 :1)


@implementation UIButton (MyFont)


+ (void)load{

    Method imp =class_getInstanceMethod([selfclass], @selector(initWithCoder:));

    Method myImp =class_getInstanceMethod([selfclass], @selector(myInitWithCoder:));

    method_exchangeImplementations(imp, myImp);

}


- (id)myInitWithCoder:(NSCoder*)aDecode{

    [selfmyInitWithCoder:aDecode];

    if (self) {

        //部分不想改变字体的tag值设置成123跳过

        if(self.titleLabel.tag != 123){

            CGFloat fontSize =self.titleLabel.font.pointSize;

            self.titleLabel.font = [UIFontsystemFontOfSize:fontSize*SizeScale];

        }

    }

    returnself;

}



@end


@implementation UILabel (MyFont)


+ (void)load{

    Method imp =class_getInstanceMethod([selfclass], @selector(initWithCoder:));

    Method myImp =class_getInstanceMethod([selfclass], @selector(myInitWithCoder:));

    method_exchangeImplementations(imp, myImp);

}


- (id)myInitWithCoder:(NSCoder*)aDecode{

    [selfmyInitWithCoder:aDecode];

    if (self) {

        //部分不像改变字体的tag值设置成123跳过

        if(self.tag !=123){

            CGFloat fontSize =self.font.pointSize;

            self.font = [UIFontsystemFontOfSize:fontSize*SizeScale];

        }

    }

    returnself;

}


@end



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值