前言
iOS开发中 富文本是我们常用的特性, 面对"花里胡哨"的文本设计, Foundation
的NSAttributedString
为我们提供了非常大的帮助, 但他的缺点也不免给我们带来了很多困扰 例如: 繁琐的API、处理交互需求的麻烦等, 为了解决日常开发中使用富文本的一些痛点, 我设计了AttributedString, 充分利用Swift语音的特性 简化富文本构建过程, 并扩展出更加优雅的交互处理, 自定义视图插入等等.
能解决哪些问题
1. 繁琐的创建过程
- 简单的富文本
- 带有段落样式的富文本
- 图文混排的富文本
这里有一个点要说一下, 附件位置的计算方式目前网络上很多都是 -4
-2
什么的都是不正确的, 字号一旦加大或者减小就都无法准确居中了, 有需要的小伙伴可以看一下我内部的实现 应该是全网最准确的了, 原理不多解释, 以后有机会单独写一篇讲解.
2. 常见的点击交互
原生的实现方式仅UITextView
支持, 也仅仅局限于URL
和NSTextAttachment
类型.
UILabel
想要支持点击等交互的实现方式有很多种, 这里不多细说. 总之如果想实现点击和长按等触发方式, 以及各种内容类型的监听和高亮样式的显示成本还是比较大的.
上面使用的是AttributedString的监听方式得到点击的回调, 还有另一种action属性的方式 下面简单展示一下.
再来一个长按触发的.
大概就是这样子, 交互相关的就演示到这里, 还有高亮样式的设置等等特性可以到Demo中去发掘.
3. 指定内容的高亮
比如想将文本中的电话号码单独设置字号和字色:
当然正则表达式肯定不能少:
4. 插入自定义视图
这里就不说原生怎么实现了 因为太麻烦了, 涉及到的点很多, 这里只展示一下AttributedString如何向UITextView
添加自定义视图.
咳咳.. 是不是太简单了? 其实它和附件的性质一样, 在AttributedString中它叫ViewAttachment
.
具体位置和大小的设置与其他附件一致. 具体参见AttributedString.Attachment.Style
.
其他问题
如何从中获取NSAttributedString
对象?
let string: NSAttributedString = AttributedString("LEE").value
是否有代码入侵?
目前全部基于extension
对UIKit
的相关控件进行功能的实现, 力求做到最小化的影响.
如何追加 拼接富文本?
AttributedString中有完善的 +
+=
运算符扩展.
同时还支持 String
+ AttributedString
和 NSAttributedString
+ AttributedString
等操作.
只支持iOS
平台吗?
AttributedString
实际是对 NSAttributedString
原生特性的一种封装, 同时增加了很多新的特性, 理论上 NSAttributedString
所支持的平台 AttributedString
都支持, 当然少部分特性除外. 例如 watchOS
就没有附件(NSTextAttachment
).
总的来说目前 AttributedString
对于iOS
、tvOS
、macOS
、watchOS
都是支持的.
未来还会增加哪些新特性?
很多 目前在计划中的包括: 表情解析器, 异步渲染(需要构建一个新的UIView
子类)等等.
如果你有什么好的建议可以在Github中发起Issues.
不太懂 能讲讲实现原理吗?
当然没问题, 等下一篇咯.
说点自身所想吧
众所周知 YYText 是OC
中一款非常优秀的富文本库, 他代表了一个时代, 但目前似乎已经没有再维护了, 积累了很多Issues无法得到解决.
而且在Swift中使用OC的库很难发挥出其语言该有的特性. 恰巧在Swift
中还没有一款能够媲美 YYText 的富文本库, 这一直是以前困扰我的点, 也是我创造AttributedString的出发点. 不能说现在AttributedString就能媲美YYText怎么样怎么样.. 毕竟还有很多工作要做, 但我会以YYText为标杆, 做到Swift
中的"YYText
" 甚至更好. 感谢大家的支持.
总结
通过上面一些简单的对比, 可以很明显看出整体代码的简化程度, 越是复杂的富文本 代码量的体现越是明显, 整体可读性也没有问题, 编写时的调用体验也很友好.
如果你觉得还不错 不妨来一波 Star Fork Share 素质三连[滑稽]~