• 工程日记之HelloSlide(2) : UITextView中如何根据给定的长宽,计算最合适的字体大小


    需求描述

    一般的需求是将UITextview的大小自适应文本高度,会做出随文本内容增加,文字框不断增大的效果;

    本文反其道而行之,在给定文字框大小的情况下:字数越多,字体越小;

    需求来源:

    考虑将文字排版成PPT,对任意一页大纲,我们可以用算法计算出这一页有哪几个文字框,分别排版在什么位置,文字框大小是多少,这样得到的幻灯片是最好看的;

    在下一步,因为文字框大小已经固定了,而填充的文字内容是用户给定的,我们需要计算用Apple系统下的多大的字体刚好可以合适的填充这个文字框;

    对“合适”的定义如下:不会超过文字框大小的最大字体

    实现思路

    已经固定了文字框的宽和高,在计算最合适字体时,我们固定宽度,计算不同字体下得到的文字总高度,一旦高度在规定的高度以内,停止搜索;

    实现时用到NSString,以及boundingRect().size()

    下面函数功能:根据文字内容、字体大小(还有字间距、行间距等影响情况,这里主要考虑字体),和固定的文字宽度,来计算文字的高度


    func getTextHeight(textStr:String,font:UIFont,CGFloat,linespace:CGFloat,wordspace:CGFloat) -> CGFloat { let normalText: NSString = textStr as NSString let size1 = CGSize( 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

  • 相关阅读:
    Decision Tree
    Bigtable:结构化数据的分布式存储系统
    堆排序分析及php实现
    PDO防sql注入原理分析
    memcached的key,value,过期时间的限制
    归并排序--详细解释版
    深入理解redis持久化
    strace追踪未开始或者来不及捕获pid的进程(译)
    php中session锁--如何防止阻塞请求(译)
    php多进程总结
  • 原文地址:https://www.cnblogs.com/Plorde/p/12312412.html
走看看 - 开发者的网上家园