使用runTime交换系统方法适配字体大小

作者: flowerflower | 来源:发表于2017-05-31 20:41 被阅读16381次

最近两天公司有点小悠闲,于是就自己瞎转悠。最近沉迷于Python的学习路上,手指忽然间痒痒了,就玩玩OC中的runtime吧。
适配字体大小的问题,我想其他开发同事也遇到过此种问题,如果直接使用UIFont systemFontOfSize设置字体大写,可能会出现在6/6s上看着刚刚好的样子,在5/5s明显感觉字体大了,而在6p/7p上又感觉字体小了。对于此类问题 我们可以采取以下两种方式解决

方式一:

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)


#define Screen_Height [UIScreen mainScreen].bounds.size.height
#define Screen_Width [UIScreen mainScreen].bounds.size.width

#define SCREEN_MAX_LENGTH (MAX(Screen_Width, Screen_Height))
#define SCREEN_MIN_LENGTH (MIN(Screen_Width, Screen_Height))

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

#define kFont(F)                                [UIFont systemFontOfSize:F]

_comeinBtn.titleLabel.font = IS_IPHONE_5?kFont(12):kFont(14);


方式二:(利用runTime给UIFont写分类 替换系统自带的方法) 推荐使用此种

//UI设计原型图的手机尺寸宽度为基准(6p)
#define YourUIScreen 414    
+(void)load{
    //获取替换后的类方法
    Method newMethod = class_getClassMethod([self class], @selector(adjustFont:));
    //获取替换前的类方法
    Method method = class_getClassMethod([self class], @selector(systemFontOfSize:));
    //然后交换类方法
    method_exchangeImplementations(newMethod, method);
}
+(UIFont *)adjustFont:(CGFloat)fontSize{
    UIFont *newFont=nil;
    newFont = [UIFont adjustFont:fontSize * [UIScreen mainScreen].bounds.size.width/YourUIScreen];
    return newFont;
}

总结

第一种方式的话(笨拙式),需要每次都进行三目运算给字体大小,而方式二(高端大气上档次式)直接使用即可,会自动算出字体大小。6一点。。

相关文章

网友评论

  • 梁森的简书:杀鸡焉用宰牛刀 直接写一个宏Font(size) [UIFont systemFontOfSize:(size*[UIScreen mainScreen].bounds.size.width/YourUIScreen)],在设置字体的时候使用这个宏 这样可好
    flowerflower:@梁森森 可以呀 我现在也是用的这个吖
  • zhanming:请问,这种方式是不是只适用于纯代码,如果项目中还有xib 那么字体大小的适配怎么处理呢?
  • 我是七月:你好,有一个问题,就是这种方法,可以限制使用么?
    比如有的字体要这样适配大小,在5s是12号,在6p是16号,这种情况可以用你这种方法,
    但是有的字体就不需要适配,比如有的字在所有的屏幕都是一个字号,都是18号字,这种情况该怎么做?
    我是七月:@flowerflower 嗯恩,对对对,谢谢了
    flowerflower:@奋斗的七月 那就不要写成分类,搞成继承的关系呀,搞成分类的是针对所有的。

本文标题:使用runTime交换系统方法适配字体大小

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