iOS根据宽高寻找最合适的字体大小(一)

最近在开发中使用UILabel时,一般都是根据字体大小,使用下面方法,获得合适的高度或宽度。 


func boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : Any]? = nil, context: NSStringDrawingContext?) -> CGRect

let constraintRect = CGSize(width: CGFloat(MAXFLOAT), height: rowHeight())
let boundingBox1 = text.boundingRect(with: constraintRect, options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: xxx)], context: nil) 复制代码

上面是非常常见的形式,当然还有另外一个方法也可以获取合适字体的大小,如下NSString的扩展方法: 

func size(withAttributes attrs: [NSAttributedStringKey : Any]? = nil) -> CGSize 复制代码

以上的方法都有一个前提条件就是UIFont需要先设置,获得的CGSize是基于此Font的大小的。但今天我想提一个特殊的需求,那就是`给一个固定大小的UILable,如何使其Text的内容可以适配该宽高,实际上就是如何让UIFont适配CGSize`。 本来想这是一个比较简单的需求,结果在网上搜索了一圈,都没有找到有人解答这个问题,那就自己动手实验解答吧。 首先实验的是下面两个方法,一个设置自动适配宽度,另一个设置最小的缩放比例。 

label.adjustsFontSizeToFitWidth = true 
label.minimumScaleFactor = 0.1; 
复制代码

设置之后,字体确实在限定的宽度范围内,但是由于高度不适配,导致字体可能会显示不完整,上下部分可能无法显示在这个UILabel范围内。 实验到这里,发现没有iOS系统没有提供合适API来满足这个需求,那就换一换思路,既然可以根据UIFont获取到对应的Size,那么是不是可以按比例放大到合适的值呢?沿着这个思路最终找到了答案。 UILabel有一个方法`sizeThatFits`,咱们就先设置一个UIFont,然后根据该方法获取CGSize,拿到该值之后,如何进行方法呢?直接上代码: 

let boundingBox = itemView.sizeThatFits(CGSize.zero) 
let rate1 = label.width / boundingBox.width 
let rate2 = label.height / boundingBox.height 
var rate = rate1 
//取比例最小的那个 
if rate1 > rate2 {
   rate = rate2
} 
label.font = UIFont.systemFont(ofSize: info.fontSize * rate)
复制代码

这样咱们就得到了合适的字体大小。最后总结一下这个需求的答案。 

1、先预设一个字体,获取该字体的合适大小;

2、该大小的宽高分别与实际需求的宽高比较获取比例值; 

3、取比例最小的那个值作为字体缩放因子; 

4、预设字体大小与该比例因子乘积的结果即为合适的字体了。 

 下面是效果图:



One more thing 

上面是求解单行文字适配,那么在文字很长的时候,单行适配会让文字显示的非常小,此时当然希望可以多行适配,那多行适配的最适合字体大小是多少呢?这个在下一篇文章中再做实验好了。

原创文章,转载请告知作者,并标明出处和作者。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值