美文网首页技术重塑适配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即可。

相关文章

  • ios字体适配的三种实现方法

    大家先看下IOS字体规范与多屏幕适配的规律和在不同尺寸屏幕适配的UI布局: 在项目中肯定会遇到字体适配的问题,从上...

  • iOS字体多屏幕适配

    写在前面 最近公司有一个需求,自己要根据屏幕放大,而由于时间赶,项目里是代码+xib混合开发的。一个个改太麻烦了,...

  • iOS字体适配

    随着iPhone机型种类的增加,iOS的小开发仔们各种机型的屏幕适配,字体适配是否困扰着你呢?我们都知道屏幕适配有...

  • iOS字体适配的几种方法总结

    在iOS开发中,有些公司对字体也有适配要求,为了让字体美观,所以在不同尺寸的屏幕上字体大小也要做到适配。 自己总结...

  • iOS字体大小适配的几种方法

    在iOS开发中,有些公司对字体也有适配要求,为了让字体美观,所以在不同尺寸的屏幕上字体大小也要做到适配。自己总结了...

  • iOS字体大小适配

    在iOS开发中,有些公司对字体也有适配要求,为了让字体美观,所以在不同尺寸的屏幕上字体大小也要做到适配。自己总结了...

  • iOS字体大小适配的几种方法

    iOS字体大小适配的几种方法 iOS字体大小适配的几种方法

  • iOS学习笔记24-不断进化的屏幕适配

    一、屏幕适配 iOS的屏幕适配可以分为3大块,代表着不同时期的屏幕适配主流: AutoResizing:在iOS6...

  • Const文件相关内容

    屏幕适配相关 文件导入 颜色字体相关

  • IOS 屏幕适配(一)理论篇

    @[TOC](IOS 屏幕适配(一)理论篇) 1. IOS 屏幕适配基本概念 1.1 IOS 设备的尺寸和分辨率 ...

网友评论

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

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

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