LCLabel

codecov Build status

LCLabel 是一个基于 TextKit 2 的 UILabel,它模仿了 UITextView 的行为

安装

Swift Package Manager

File -> Swift Packages -> Add Package Dependency

Enter package URL: https://github.com/mustiikhalil/LCLabel
dependencies: [
  .package(
    name: "LCLabel",
    url: "https://github.com/mustiikhalil/LCLabel",
    from: "X.Y.Z"),
]

如何使用

let text = NSMutableAttributedString(
  string: "welcome to this new adventure!!!",
  attributes: [:])
let range = (text.string as NSString).range(of: "welcome")
text.addAttribute(
  .lclabelLink, // Note we use type `lclabelLink`
  value: URL(string: "tel://909001")!,
  range: range)
let label = LCLabel(
  frame: CGRect(
    origin: .zero, 
    size: .init(
      width: 300, 
      height: 30)))
label.isUserInteractionEnabled = true
label.delegate = self
label.attributedText = text
view.addSubview(label)

或者,如果正在使用 AutoLayout

let label = LCLabel(frame: .zero)
label.isUserInteractionEnabled = true
label.delegate = self
label.attributedText = text
view.addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
  label.topAnchor.constraint(equalTo: view.topAnchor),
  label.leadingAnchor.constraint(equalTo: view.leadingAnchor),
  label.trailingAnchor.constraint(equalTo: view.trailingAnchor),
  label.bottomAnchor.constraint(equalTo: view.bottomAnchor)])

注意

在使用 TextKit 构建它时,虽然很有趣,但也发现以下问题

开始使用

git clone https://github.com/mustiikhalil/LCLabel
cd LCLabel
open DemoApp/DemoApp.xcodeproj
// or
open package.swift

性能

内存

以 UILabel 作为基线,我们能够实现与 UILabel 相似的性能。

一个简单的文本在 LCLabel 中会占用大约 96 Kib 的内存,而 UILabel 也是如此。

单行文本在 LCLabel 中会占用大约 384 Kib 的内存,而 UILabel 也是如此。

带有 Emoji 表情的单行文本在 LCLabel 中会占用大约 1.12 MiB 的内存,而 1.23 MiB 的 UILabel 也是如此。

滚动

以 UILabel 作为基线,我们能够在滚动时实现与 UILabel 相似的性能,这在 UI Full Tests 中进行了测量。 基准测试基于在 iPhone XS 上检测到的卡顿数量,当滚动列表大约 5 次时,两个标签都零卡顿。

许可证

LCLabelMIT 许可证

免责声明

UILabelUITextView 是 Apple 自己的组件。