zoukankan      html  css  js  c++  java
  • 工程日记之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

  • 相关阅读:
    Jmeter csv文件进行参数化的两种方法
    Jmeter逻辑控制器: If控制器的解读
    Selenium问题集锦
    Jmeter BeanShell
    Jmeter进行接口流程测试
    服务器上部署Struts2的web项目报struts-default.xml:131:154的解决方法
    jmeter用Windows电脑分布式部署
    JMeter-一个接口的返回值作为输入传给其他接口:设置全局变量和非全局变量
    Flutter调研-Flutter基础知识、安装与demo
    MAC上安装maven以及配置Intellij IDEA
  • 原文地址:https://www.cnblogs.com/Plorde/p/12312412.html
Copyright © 2011-2022 走看看