美文网首页技术重塑适配111
iOS字体多屏幕适配

iOS字体多屏幕适配

作者: Bob_Blog | 来源:发表于2017-11-29 09:28 被阅读558次

    写在前面

    最近公司有一个需求,自己要根据屏幕放大,而由于时间赶,项目里是代码+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

    iphone6

    iPhone 6p


    iphone6 plus

    下载地址

    github下载地址:demo

    如果觉得不错的话给个star吧!

    更多在我的blog:博客

    支持pod : pod 'TBFontAdjust', '~> 1.0.0'

    使用方法:根据当前的UI图,设置正确的TB_UIScreen即可。

    相关文章

      网友评论

      • 阿兹尔:不用pod 加载 直接拖文件夹。拖那个文件夹
        Bob_Blog:@阿兹尔 TBFontAdjust里Classes文件夹(TBFontAdjust-master->TBFontAdjust->Classes)

      本文标题:iOS字体多屏幕适配

      本文链接:https://www.haomeiwen.com/subject/sdtubxtx.html