发布网友 发布时间:2023-07-06 23:25
共1个回答
热心网友 时间:2024-10-22 23:43
先来看看效果图:
以前都是中文模式,label显示的内容都比较短,可以一行显示完全,所以实现方式就比较多了,可以使用3个label,分别显示前、中、后三段内容,然后分别配置各个label的属性。
但是!,后来需求变动,要添加英文模式,这里就能看的,英文模式下,要显示的内容就大大加长了。(也就是说一行不能完全显示)
这里就要使内容高度宽度自适应了
这也就是将要提到的 思路2
因为UITextview已经默认将内容拼合起来, 而且它存在一个 attributedText 属性
所以,我们可以根据 range 或者根据正则来配置中间用户键入的文字属性。
自定义view配置各个控件就不贴了。
这里主要就是一个宽度的计算问题:
还有一点要注意:
我发现一般来说UITextview都会有上下左右四个方向的边距(大约为8px),若想要修改UITextview中内容的四个边距,一般来说我们都会设置 contentInset 属性,但是,在textview中好像并不太好使,看了下文档,里边有一个属性
可以看到,此属性就是修改textview文本内容的containerView的内边距的
设置一下即可:
注:若textview的约束没设置正确,设置textContainerInset也有可能会显示不正常
以上就能达到上图那样的效果
TextKit 是苹果提供的基于 Core Text 的渲染带文字的诸如 UILaebl , UITextField , UITextView 等控件的高级API。
相当于MVC中的model,用来提供要展示的数据。
而且NSTextStorage是NSMutableAttributedString的子类,所以配置的时候,可以添加一些文字需要展示的属性。
平时我们在使用的时候,可以直接使用此类的实例,但是,如果需要自定义的时候,要继承于他,此时,我们要额外实现四个方法:
可以看到,我们要额外实现:四个方法,来配置string,然后NSTextStorage会调用 edited:range:changeInLength 方法
可以看到,上面的方法会记录改变的信息,也就是说string的每一次改变, NSTextStorage都会调用此方法。然后 edited:range:changeInLength: 方法也会自动调用 beginEdiging 方法,传递文字变化状态,
(也可以使用 beginEditing/endEditing 方法包裹住要处理的数据,在endEditing方法调用之后,会自动调用 processEditing 传递变化。)
然后 processEditing ,会调用NSLayoutManager的 textStorage:edited:range:changeInLength:invalidatedRange: 方法把textStorage传过来的字符串绘制出图形
NSLayoutManager则相当于MVC中的Controller.用来协调model的数据和展示view(UITextView,UITextfield,UILabel etc.)之间的关系。
这里有一点需要注意:
如果我们自己要绘制文字的时候,需要先绘制背景,然后再绘制文字。
常用的方法有几大类:
1). 生成类:可以生成图形和布局
2). 获取类:获取图形、布局的信息
3). 绘图类, 按照图形布局信息,绘制文字
该类是辅助类,辅助view生成盛放NSLayoutManager类生成的图形。
如:
NSTextview 中的
该类可以设置以下属性:
size :展示区域的大小
exclusionPaths :排除展示区域的路径,是一个内部盛放UIBezierPath对象的数组
lineBreakMode : 换行模式
lineFragmentPadding :线段边距
以及提供了一个方法,来设置以上提及的一些属性
我们可以通过创建NSTextContainer的子类,然后重写该方法,来定义那些文字展示在不规则图形中的情况
总结一下;整体的绘制流程如下:
Using Text Kit to Draw and Manage Text
TextKit Best Practices WWDC 2018
TextKit Best Practices WWDC 2018中文图解
Bullet list on iOS with TextKit
Getting to Know TextKit
String Rendering
How to fit text in a circle in UILabel
初识 TextKit