工程日记之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-- ...
随机推荐
- Java虚拟机05.1(各种环境下jvm的参数如何调整?)
cmd下 eclipse下 tomcat下 cmd下指定jvm参数 在cmd下执行Java程序可以通过如下方式之地需要配置的Java 虚拟机参数: 这里只是指定了对初始为2M,新生代为1M,堆最大值为 ...
- 页面的html调试
点击页面按下键盘的F12,或者鼠标右键选择检查(N) 会弹出一个窗口,这个窗口就是调试窗口 如上图所示,第一个图标是标签元素选择器,点击使用后,在页面上移动,会在Elements的区域找到你鼠标选中的 ...
- NirSoft 实用程序
64-bit (x64) utilities package 此软件包包含NirSoft中的所有实用程序,这些实用程序具有64位版本(x64)Windows的独立构建. 此程序包包含下面列表中每个实用 ...
- 《YouTube 网站的架构演进》阅读笔记
概述 YouTube 在国内是个404网站,需要翻墙得见,这是有用的废话,先铺垫一下. 从全球网站来看,它仅次于母公司 Google,全球排名位列第2.每天超过5亿以上视频播放量,平均每个用户点击10 ...
- Atcoder比赛副站
https://agc039.contest.atcoder.jp/
- Golang的选择结构-switch语句
Golang的选择结构-switch语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.选择语句应用场景概述 选择结构也称为条件判断,生活中关于判断的场景也非常的多,比如: ( ...
- Golang的变量定义及使用案例
Golang的变量定义及使用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.变量的定义 package main import "fmt" func m ...
- HihoCoder第十周:后序遍历
也就在大二学数据结构的时候知道了树的前序遍历.后序遍历.中序遍历.之后就忘了,在之后就是大四研究生老师考我,我当时还不知道,真够丢人的.自此之后,知道了如何通过其中两个得到第三个,但是也没有编程实现过 ...
- POJ 2142:The Balance
The Balance Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4781 Accepted: 2092 Descr ...
- linux下安装redis,按照redis官网安装不成功需要提前安装c++环境(安装成功并可以测试)
这个安装是一种便捷的安装,没有几句,但是完全按照官网上的来没有安装成功,有前提条件的 打开linux root登录 然后在usr下面建文件夹redis,进入 在该文件加下,直接按照官网的指导进行安装即 ...