写在前面
最近公司有一个需求,自己要根据屏幕放大,而由于时间赶,项目里是代码+xib混合开发的。一个个改太麻烦了,任务量太大,xib构建的页面还不好修改。
找了一些资料,大功告成,然后根据自己的理解一个demo。
Runtime的运用
这里运用的就是替换系统方法,具体参考我另一篇文章:Runtime实战使用篇
- 基于NSObject写个y一个类别,一个是实体方法,一个是类方法.
//类方法
+ (BOOL)swizzleClassMethod:(SEL)originalSel with:(SEL)newSel {
Class class = object_getClass(self);
Method originalMethod = class_getInstanceMethod(class, originalSel);
Method newMethod = class_getInstanceMethod(class, newSel);
if (!originalMethod || !newMethod) return NO;
method_exchangeImplementations(originalMethod, newMethod);
return YES;
}
//实体方法
+ (BOOL)swizzleInstanceMethod:(SEL)originalSel with:(SEL)newSel {
Method originalMethod = class_getInstanceMethod(self, originalSel);
Method newMethod = class_getInstanceMethod(self, newSel);
if (!originalMethod || !newMethod) return NO;
class_addMethod(self,
originalSel,
class_getMethodImplementation(self, originalSel),
method_getTypeEncoding(originalMethod));
class_addMethod(self,
newSel,
class_getMethodImplementation(self, newSel),
method_getTypeEncoding(newMethod));
method_exchangeImplementations(class_getInstanceMethod(self, originalSel),
class_getInstanceMethod(self, newSel));
return YES;
}
- 针对纯代码的,存代码设置字体大小会调用systemFontOfSize:方法,我们在+(void)load交换方法处理下。
TB_UIScreen:指当前屏幕的宽度,可以根据自己UI设置的屏幕修改。demo默认值:320
+(void)load
{
[self swizzleClassMethod:@selector(systemFontOfSize:) with:@selector(TB_systemFontOfSize:)];
[self swizzleClassMethod:@selector(boldSystemFontOfSize:) with:@selector(TB_boldSystemFontOfSize:)];
}
+ (UIFont *)TB_systemFontOfSize:(CGFloat)pxSize{
UIFont *font = [UIFont TB_systemFontOfSize:pxSize*[UIScreen mainScreen].bounds.size.width/TB_UIScreen];
return font;
}
//粗体
+(UIFont*)TB_boldSystemFontOfSize:(CGFloat)pxSize
{
UIFont *font = [UIFont TB_boldSystemFontOfSize:pxSize*[UIScreen mainScreen].bounds.size.width/TB_UIScreen];
return font;
}
- 针对Xib上的,我们知道xib创建的会调用initWithCoder:方法,所以将此方法进行处理一次,调用UIFont方法。
为此对UILabel,UIButton,UITextFile,UItextView进行了处理,就拿label来说吧!
+(void)load
{
[[self class] swizzleInstanceMethod:@selector(initWithCoder:) with:@selector(TB_InitWithCoder:)];
}
- (id)TB_InitWithCoder:(NSCoder*)aDecode{
[self TB_InitWithCoder:aDecode];
CGFloat pt = self.font.pointSize;
self.font = [UIFont systemFontOfSize:pt];//这个方法会进行字体转换
return self;
}
效果图
iPhone 5s
iphone5s
iPhone 6
iphone6iPhone 6p
iphone6 plus
下载地址
github下载地址:demo
如果觉得不错的话给个star吧!
更多在我的blog:博客
支持pod : pod 'TBFontAdjust', '~> 1.0.0'
使用方法:根据当前的UI图,设置正确的TB_UIScreen即可。
网友评论