基于CoreText
,用Swift
实现的轻量级自定义Label,代码整体思路类似于YYText
,但是做了很多优化,加入很多自己的理解,在YYText
的基础上,解决了许多issues
中未解决的问题。
在开发中,使用到富文本在所难免,大家用的最多的可能就是YYText
了,但是YYtext
已经有3年没更新了,而iOS系统却一直在更新,一个再好的三方库,如果不一直维护,也会随着系统的不断升级出现各种bug。在我使用YYText
的过程中,就出现了各种问题,比如高度计算不准确、文本垂直居中有问题等等。也正是因为这些原因,促使我写了这个库,同时仔细阅读YYText
源码,并翻阅其他各种富文本三方库,写一个属于自己的富文本框架。
在编写该框架过程中,借鉴了许多三方库:
- YYtext(主要)
- BSText(Swift版本的YYText)
- TYAttributedLabel
- TYText
- DTCoreText
- M80AttributedLabel
- ✅
SwiftLabel
的API和系统原生UILabel
一样,并且增加了一些新特性 - ✅ 支持异步与同步渲染,默认开启了异步渲染
- ✅ 图文混排支持
UIImage
、UIView
、CALayer
- ✅ 支持自定义高亮,并设置
userInfo
,点击时,可获取到该userInfo
- ❌ 不支持垂直排版
属性 | Demo |
---|---|
图文混排 | |
下划线(SwiftyTextUnderLine) | |
删除线(SwiftyTextStrikethrough) | |
高亮 |
更多效果请运行Demo
该问题,本人对源码进行了仔细阅读,发现在YYTextAsyncLayer
和YYLabel
中中,都同时设置了contentsScale
,因此不会出现该问题
待解决
之后的更新会加上,前期该功能先暂时忽略
待解决
已解决。在CTLineTruncationType
为start
和middle
的情况下,需要单独设置下lastLineAttributedText
。
原问题有人已经给出了解决办法,但是有限制,本人进行了优化。
该问题本人猜测是由于displaysAsynchronously
设置为true
,但是却在非主线程操作UI导致的,本人在displaysAsynchronously
为true
时,加入了
dispatch_async(dispatch_get_main_queue(), ^{
});
待解决
在写框架Demo的过程中,本人终于复现了该问题。
当label
的lineBreakMode
设置为byCharWrapping
,然后用YYTextLayout
的layoutWithContainerSize:text:
计算高度,就有可能会出现高度计算不准确的问题。
仔细阅读YYLabel
源码,发现在对label
设置lineBreakMode
时,内部会对lineBreakMode
进行纠正,也就是说最终的lineBreakMode
有可能不是你最初传入的值,而YYTextLayout
的layoutWithContainerSize:text:
默认使用的lineBreakMode
为byTruncatingTail
。byCharWrapping
和byTruncatingTail
在中英文混排时,表现形式是不一样的,这也就是YYTextLayout
计算高度不准确的原因。
本框架已解决该问题,但是需要特别的设置
let lineBreakMode: NSLineBreakMode = .byCharWrapping // 定义一个常量,存储`lineBreakMode`、
self.label.lineBreakMode = lineBreakMode // `label`设置`lineBreakMode`
let container = SwiftyTextContainer()
container.size = CGSize(width: frame.width, height: CGFloat.greatestFiniteMagnitude)
container.lineBreakMode = lineBreakMode // `container`设置`lineBreakMode`
let layout = SwiftyTextLayout.layout(container: container, attributedText: sumAtr)