工程日记之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: )
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
工程日记之HelloSlide(2) : UITextView中如何根据给定的长宽,计算最合适的字体大小的更多相关文章
- 工程日记之HelloSlide(1):Swift自定义可视化组件的方法(继承UIView和在StoryBoard中设置)
需求描述 HelloSlide是把文本自动转化成幻灯片的软件,在幻灯片中我们有SmartArt:各种各样的几何形状,并且可以自定义大小和颜色,放在幻灯片不同的位置. 为了在我们的软件中实现类似的效果, ...
- 工程日记之HelloSlide(3):如何使用Core Data数据库,以及和sqlite之间的对应关系
Core Data 和 SQLite 是什么关系 core data是对sqlite的封装,因为sqlite是c语言的api,然而有人也需要obj-c的api,所以有了core data ,另外,co ...
- CSS中字距,词距,首行缩进,字体大小,排版相关问题的探讨
先说明下,这是在谷歌浏览器下字体显示等问题做个研究,火狐下有点差异,不过火狐占有率低,而且显示的没有谷歌那么合理,不管它先.IE卡的要死,半死不活,也懒得深入研究这些细节,字体排版上不是强迫症,差别也 ...
- 第一章:eclipse 中修改字体大小和编码格式
eclipse 中修改字体大小的步骤: 1. 在 eclipse 的工具栏中,找到 weindows 下面的 preferences 2. 在 preferences 的 输出 font ,在 Bas ...
- demo工程的清单文件及activity中api代码简单示例
第一步注册一个账户,并创建一个应用.获取app ID与 app Key. 第二步下载sdk 第三步新建工程,修改清单文件,导入相关的sdk文件及调用相应的api搞定. 3.1 修改清单文件,主要是加入 ...
- iOS Dev (60) 怎样实现 UITextView 中的 placeHolder
iOS Dev (60) 怎样实现 UITextView 中的 placeHolder 作者:阿锐 地址:http://blog.csdn.net/prevention - 跟着你的 UITextVi ...
- 多媒体开发之h264中的sps---sps信息提取之分辨率宽高提取2
-------------------author:pkf -----------------------------time:2015-8-20 -------------------------- ...
- MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。
CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...
- 改变Eclipse 中代码字体大小
1.改变eclipse 中代码字体大小,就是我打进去的java文件的字体大小 wiondow--preferences--general--appearance--colors and fonts-- ...
随机推荐
- springboot 中单机 redis 实现分布式锁
在微服务中经常需要使用分布式锁,来执行一些任务.例如定期删除过期数据,在多个服务中只需要一个去执行即可. 以下说明非严格意义的分布式锁,因为 redis 实现严格意义的分布式锁还是比较复杂的,对于日常 ...
- eshop1-大型电商架构演进
1. 项目初期 2. 服务器分离 以上的服务分离架构,即使文件服务crash 了,但是application server 和 Database Server 继续可以访问运行 3. 基于并发访问越来 ...
- centos6或7查看端口占用及解除占用
一.查看端口占用 netstat -lnp|grep 要查看的端口号 例如:查看占用端口7000的进程 netstat -lnp|grep 7000 二.清除占用 (1)一次性的清除占用80端口的程序 ...
- 使用 mtd-utils 烧写Arm Linux 系统各个部分
有关博客:<Arm-Linux 移植 mtd-utils 1.x>.<mtd-utils 的 使用> 背景: 作为一项技术储备,可用于增强系统可维护性. 要求: 要求主板以mt ...
- Gym - 101190F Foreign Postcards (期望dp)
题意:有n张标有“C”或“F”的卡片. 1.随机取前k张(1<=k<=n) 2.若这k张的第一张为“C”,则不翻转,否则,全部翻转这k张. 3.然后处理剩下的n-k张 4.重复步骤1~3直 ...
- duilib+cef自定义浏览器控件编译错误
新版博客已经搭建好了,有问题请访问 htt://www.crazydebug.com 公司二期好主播项目,决定用duilib开发界面,且从ie内核换成谷歌内核 再用duilib自定义一个Browser ...
- WTL之手动编写框架窗口
新版博客已经搭建好了,有问题请访问 htt://www.crazydebug.com 本人是一个实践主义者,不罗嗦上一篇工程搭建好以后,这一篇就开始写代码,写之前再说几句,如果你熟悉MFC分析过MFC ...
- 《动手学深度学习》系列笔记—— 1.2 Softmax回归与分类模型
目录 softmax的基本概念 交叉熵损失函数 模型训练和预测 获取Fashion-MNIST训练集和读取数据 get dataset softmax从零开始的实现 获取训练集数据和测试集数据 模型参 ...
- 二十四、JavaScript之取字符串长度
一.代码如下 二.效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" conten ...
- 030-PHP日期查询函数
<?php , , ))//检查日期函数 { print("2,18,1970 :" . "这是一个正确的日期格式"); } else { print(& ...