• 工程日记之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

  • 相关阅读:
    dubbo+zookeeper注册服务报错问题:No service registed on zookeeper
    悲观锁和乐观锁的区别,它们是怎么实现
    cookie和session的区别,分布式环境怎么保存用户状态
    深入理解Java接口和抽象类
    Java中堆内存和栈内存详解
    Java基础梳理(一)
    Spring的@Transactional注解详细用法
    SpringBoot学习笔记(一)基础
    项目实体类使用@Data注解,但是项目业务类中使用getA(),setA()方法报错,eclipse中配置lombok
    有依赖的背包问题-购物单
  • 原文地址:https://www.cnblogs.com/Plorde/p/12312412.html
走看看 - 开发者的网上家园