工程日记之HelloSlide(2) : UITextView中如何根据给定的长宽,计算最合适的字体大小
需求描述
一般的需求是将UITextview的大小自适应文本高度,会做出随文本内容增加,文字框不断增大的效果;
本文反其道而行之,在给定文字框大小的情况下:字数越多,字体越小;
需求来源:
考虑将文字排版成PPT,对任意一页大纲,我们可以用算法计算出这一页有哪几个文字框,分别排版在什么位置,文字框大小是多少,这样得到的幻灯片是最好看的;
在下一步,因为文字框大小已经固定了,而填充的文字内容是用户给定的,我们需要计算用Apple系统下的多大的字体刚好可以合适的填充这个文字框;
对“合适”的定义如下:不会超过文字框大小的最大字体
实现思路
已经固定了文字框的宽和高,在计算最合适字体时,我们固定宽度,计算不同字体下得到的文字总高度,一旦高度在规定的高度以内,停止搜索;
实现时用到NSString,以及boundingRect().size()
下面函数功能:根据文字内容、字体大小(还有字间距、行间距等影响情况,这里主要考虑字体),和固定的文字宽度,来计算文字的高度
func getTextHeight(textStr:String,font:UIFont,width:CGFloat,linespace:CGFloat,wordspace:CGFloat) -> CGFloat { let normalText: NSString = textStr as NSString let size1 = CGSize(width: width, height: 10000) let ParagraphStyle=NSMutableParagraphStyle() ParagraphStyle.lineSpacing=linespace let stringSize = normalText.boundingRect(with: size1, options: .usesLineFragmentOrigin, attributes:[NSAttributedString.Key.font:font,NSAttributedString.Key.kern:wordspace,.paragraphStyle:ParagraphStyle], context:nil).size return stringSize.height }
注意事项
这样计算出来可能文本显示不全,这是因为:
UITextview有一个textContainer
1、系统会为其默认设置距UITextView上、下边缘各8的页边距:
2、textContainer中的文段的上、下、左、右又会被填充5的空白。
所以对于自己的Textview,需要设置:
self.textContainerInset = UIEdgeInsetsZero;
self.textContainer.lineFragmentPadding = 0;
参考:
https://www.jianshu.com/p/32a4747a19fb