美文网首页
iOS字体适配

iOS字体适配

作者: 冰点雨 | 来源:发表于2020-03-12 12:35 被阅读0次

    1.适配方案总结

    1.等比例缩放+加减->1.1按不同机型或屏幕宽等比缩放->1.2按不同机型或屏幕宽加减
    2.runtime方法替换

    2.参考文章

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

    3.不同机型的物理尺寸图和分辨率数据

    img.jpg

    4.字体适配方案

    4.1 使用宏根据屏幕宽度或者机型来适配

    使用场景:纯代码,不同屏幕显示字号有UI规范

    //1.在PCH文件中定义宏,调用UIFont的分类方法
    #define FontCaseOne(F) [UIFont fontSize:(F)]
    
    //2. UIFont(FitFont) 分类方法实现,此处采用的方案是375屏宽以上字体+1,375屏宽以上字体-1
    
    + (UIFont *)fontSize:(CGFloat)font {
        if (SCREEN_WIDTH == 320) {
            return [UIFont systemFontOfSize:(font - 1)];
        }else if (SCREEN_WIDTH == 375){
            return [UIFont systemFontOfSize:font];
        }else{
            return [UIFont systemFontOfSize:(font + 1 )];
        }
    }
    

    4.2 用宏定义适配字体大小(根据屏幕尺寸判断)

    1.5代表6P尺寸的时候字体为1.5倍,5S和6尺寸时大小一样,也可根据需求自定义比例。

    #define IsIphone6P          SCREEN_WIDTH==414
    #define SizeScale           (IsIphone6P ? 1.5 : 1)
    #define kFontSize(value)    value*SizeScale
    #define kFont(value)        [UIFont systemFontOfSize:value*SizeScale]
    

    4.3 根据屏幕高度做字体适配

    使用场景:纯代码,UI组件竖屏流体居多,根据屏幕宽度做不同字体适配,但是适配方案是根据屏幕高度的比例来做

    //1.在PCH文件中定义宏,方便调用,调用UIFont的分类方法
    
    #define FontCaseTwo(F) [UIFont fit_screenWidith:(F)]
    #define FitHeight(H) [UIView fit_screenHeight:(H)]
    
    //2. UIView (Fit)方法实现,实现fit_screenHeight方法
    + (CGFloat)fit_screenHeight:(CGFloat)height {
        CGFloat H = (height / 667.000 * [UIScreen mainScreen].bounds.size.height);
        return H;
    }
    
    //3. UIFont(FitFont) 分类方法实现,实现fit_screenWidith方法
    + (UIFont *)fit_screenWidith:(CGFloat)font {
        if (SCREEN_WIDTH == 320) {
            return [UIFont systemFontOfSize:FitHeight(font)];
        }else if (SCREEN_WIDTH == 375){
            return [UIFont systemFontOfSize:FitHeight(font)];
        }else{
            return [UIFont systemFontOfSize:FitHeight(font)];
        }
    }
    

    4.4 根据屏幕高度,利用runtime方法交换适配

    如果用了这个方案,整个调用系统的方案都会被修改,别的方案就没有效果了

    // UIFont (RuntimeFit)实现
    
    + (void)load {
        // 获取替换后的类方法,即自己的方法
        Method selfMethod = class_getClassMethod([self class], @selector(runtimeFitFont:));
    // 获取替换前的类方法,即系统方法
        Method systenMethod = class_getClassMethod([self class], @selector(systemFontOfSize:));
    //然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)
        method_exchangeImplementations(selfMethod, systenMethod);
    }
    
    + (UIFont *)runtimeFitFont:(CGFloat)fontSize {
        UIFont *fitFont = nil;
        //这里并不会造成递归调用,方法已经被交换
        fitFont = [UIFont runtimeFitFont:fontSize * (SCREEN_WIDTH / 375 )];
        return fitFont;
    }
    

    外部正常调用系统设置字体方法就行

    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 150, [UIScreen mainScreen].bounds.size.width, 60)];
    label.text = @"iOS字体大小适配";
    label.font = [UIFont systemFontOfSize:16];
    [self.view addSubview:label];
    

    相关文章

      网友评论

          本文标题:iOS字体适配

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