Skip to content

liujunliuhong/SwiftyText

Repository files navigation

SwiftyText

基于CoreText,用Swift实现的轻量级自定义Label,代码整体思路类似于YYText,但是做了很多优化,加入很多自己的理解,在YYText的基础上,解决了许多issues中未解决的问题。

👉该框架不支持OC,只支持Swift👈

框架正在完善中,暂时不支持pod,稳定之后将支持pod

背景

在开发中,使用到富文本在所难免,大家用的最多的可能就是YYText了,但是YYtext已经有3年没更新了,而iOS系统却一直在更新,一个再好的三方库,如果不一直维护,也会随着系统的不断升级出现各种bug。在我使用YYText的过程中,就出现了各种问题,比如高度计算不准确、文本垂直居中有问题等等。也正是因为这些原因,促使我写了这个库,同时仔细阅读YYText源码,并翻阅其他各种富文本三方库,写一个属于自己的富文本框架。

在编写该框架过程中,借鉴了许多三方库:

特性

  • SwiftLabel的API和系统原生UILabel一样,并且增加了一些新特性
  • ✅ 支持异步与同步渲染,默认开启了异步渲染
  • ✅ 图文混排支持UIImageUIViewCALayer
  • ✅ 支持自定义高亮,并设置userInfo,点击时,可获取到该userInfo
  • ❌ 不支持垂直排版

效果

属性 Demo
图文混排
下划线(SwiftyTextUnderLine)
删除线(SwiftyTextStrikethrough)
高亮

更多效果请运行Demo

针对YYText中目前未被Close的问题,本人接下来会一一进行解答

该问题,本人对源码进行了仔细阅读,发现在YYTextAsyncLayerYYLabel中中,都同时设置了contentsScale,因此不会出现该问题

待解决

之后的更新会加上,前期该功能先暂时忽略

待解决

已解决。在CTLineTruncationTypestartmiddle的情况下,需要单独设置下lastLineAttributedText。 原问题有人已经给出了解决办法,但是有限制,本人进行了优化。

该问题本人猜测是由于displaysAsynchronously设置为true,但是却在非主线程操作UI导致的,本人在displaysAsynchronouslytrue时,加入了

dispatch_async(dispatch_get_main_queue(), ^{

});

待解决

在写框架Demo的过程中,本人终于复现了该问题。

labellineBreakMode设置为byCharWrapping,然后用YYTextLayoutlayoutWithContainerSize:text:计算高度,就有可能会出现高度计算不准确的问题。

仔细阅读YYLabel源码,发现在对label设置lineBreakMode时,内部会对lineBreakMode进行纠正,也就是说最终的lineBreakMode有可能不是你最初传入的值,而YYTextLayoutlayoutWithContainerSize:text:默认使用的lineBreakModebyTruncatingTailbyCharWrappingbyTruncatingTail在中英文混排时,表现形式是不一样的,这也就是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)

Releases

No releases published

Packages

No packages published