iOS文字大小自适应库(MBFontAdapter)诞生记

背景

什么是iOS文字大小自适应?单纯回答这个问题实在太困难…所以讲一个故事,就很好理解了:

某天做UI设计的妹子弱弱地问我:“我们的app可不可以实现文字的字号在iPhone6上和iPhone6Plus上比iPhone4s和iPhone5大一些?如果要实现难度是不是比较大?工作量会不会增加很多?”其实当我听到这个问题的时候,我整个人都不好了,因为目前主流的app貌似没有这么干的。然而,这个时候能回答不可以么?能回答很难么?能回答工作量会增加很多么?能告诉UI主流app都不这么干么?显然不能!!!于是就有了MBFontAdapter。

前提

字号自适应的目的只是为了更满足UI设计的需要。简单来说就是为了界面的美观,所以是有几点前提的:

思路分析storyboard自带方法

storyboard支持在不同布局方式下(Compact、Regular和Any)下设置不同的字号大小,如下图:

点击红框中的+号就可以添加不同布局方式时字号的大小

注:虽然这种方法可以单独定制每个控件在不同布局方式时字号的大小,但是太麻烦。因为我们UI的需求是每个带文字的控件都需要这样设置…你能想象一个一个设置是怎样的痛苦么?

我的方法

因为有文字的控件就有那么几个:UILabel、UITextField、UIButton和UITextView。所以我可以继承这几个控件的类,然后重载它们的一些实现方法即可。用户在使用的时候只需要将类设置为继承的类即可。下面就是具体的实现步骤:

第一步

当然是要先知道当前设备iPhone6还是iPhone6Plus(因为根据UI的需求,她设计时字号都是按照iPhone5的屏幕大小来定的,所以在iPhone6上面字号要稍微大一点,然后iPhone6Plus上字号要更大一点)。代码很简单

#define IS_IPHONE_6 ([[UIScreen mainScreen] bounds].size.height == 667.0f)#define IS_IPHONE_6_PLUS ([[UIScreen mainScreen] bounds].size.height == 736.0f)第二步

然后就是要确定字号应该变大多少(根据后面和UI的沟通,我们把iPhone6上的字号变大了2号,iPhone6Plus上的字号变大了3号)。

IPHONE6PLUS_INCREMENT 3第三步

然后就是核心逻辑,我封装了一个方法,这个方法的作用是传入一个UIFont对象,然后根据当前设备,将UIFont的字号做相应的调整,然后返回一个新的UIFont对象。代码如下:

+(UIFont *)adjustFont:(UIFont *)font{UIFont *newFont=nil;if (IS_IPHONE_6){newFont = [UIFont fontWithName:font.fontName size:font.pointSize+IPHONE6_INCREMENT];}else if (IS_IPHONE_6_PLUS){newFont = [UIFont fontWithName:font.fontName size:font.pointSize+IPHONE6PLUS_INCREMENT];}else{newFont = font;}return newFont;}第四步

然后就是控件层的分析。

首先,控件的生成有两种方式,,一种是通过代码生成,还有一种是通过storyboard和xib生成。

然后就是字体的初始大小的设置问题。根据UI设计,不同的地方字体的大小肯定不一样,所以还是要手动设置一次的,我们app的字体是完全按照UI给定的大小来设置的(只是在iPhone6和iPhone6Plus上会做相应的字号放大),如果是代码生成则调用控件setFont方法,如果是storyboard和xib则在下图红框标注的位置设置字号即可:

然后就是重载的方法,第一个是setFont方法,代码如下:

-(void)setFont:(UIFont *)font{[super setFont:[MBFontAdapter adjustFont:font]];}

这样用户在调用.font或者setFont时就会自动对字号进行处理。

然后是awakeFromNib,这个方法是当控件是由xib和storyboard生成时会调用的,思路是拿到控件当前的font(也就是在上图中设置字体的地方设置的那个字号),然后进行处理,代码如下:

-(void)awakeFromNib{[super awakeFromNib];[super setFont:[MBFontAdapter adjustFont:self.font]];}

具体的使用方法可以下载demo查看: https://github.com/mmoaay/MBFontAdapter

注:目前已经完美支持storyboard和xib

代替你主持夕阳的葬礼。

iOS文字大小自适应库(MBFontAdapter)诞生记

相关文章:

你感兴趣的文章:

标签云: