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

  • 相关阅读:
    codeforces C. Cows and Sequence 解题报告
    codeforces A. Point on Spiral 解题报告
    codeforces C. New Year Ratings Change 解题报告
    codeforces A. Fox and Box Accumulation 解题报告
    codeforces B. Multitasking 解题报告
    git命令使用
    shell简单使用
    知识束缚
    php 调用系统命令
    数据传输方式(前端与后台 ,后台与后台)
  • 原文地址:https://www.cnblogs.com/Plorde/p/12312412.html
Copyright © 2020-2023  润新知