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
上面是求解单行文字适配,那么在文字很长的时候,单行适配会让文字显示的非常小,此时当然希望可以多行适配,那多行适配的最适合字体大小是多少呢?这个在下一篇文章中再做实验好了。
原创文章,转载请告知作者,并标明出处和作者。