LCLabel is a TextKit 2 based UILabel that mimics a the behaviour of UITextView
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)or incase AutoLayout is being used
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)])While building it with TextKit was interesting, the following nits where found:
-
Setting the styles for links are usually broken. There are two solutions for this: 1- Use type
.lclabelLinkinstead of.linkwhen creating your NSAttributedString2- Setting
linkStyleValidationto be.ensurewhich will force the NSTextStorage to either replace all the instances of.linkwith.lclabelLinkor takes values oflinkAttributesand sets them to the Storage. -
linkAttributeswould only be set if.ensurewas set.
git clone https://github.com/mustiikhalil/LCLabel
cd LCLabel
open DemoApp/DemoApp.xcodeproj
// or
open package.swift-
LCLabelhas three schemas to build- LCLabel // Lib
- DemoApp // Demo app & test cases
- UI Full Tests // UITests that includes hitches tests
-
DemoAppexplains how to use LCLabel -
DemoAppcan be ran in three modes,-scrollview,-autolayoutanddefault. You will need to pass the arguments asArguments Passed On Launch -
UI Full Testsshows that LCLabel doesnt have any hitches The following was compared on an iPhone xs with a baseline of UILabel
Using UILabel as a baseline, we were able to achieve a similar performance to UILabel.
A simple text in a LCLabel would use around 96 Kib in memory compared to UILabel.
A single line text in a LCLabel would use around 384 Kib in memory compared to UILabel.
A single line with Emojis text in a LCLabel would use around 1.12 MiB in memory compared to the 1.23 MiB UILabel.
Using UILabel as a baseline, we were able to achieve a similar performance to UILabel,
when scrolling and that was measured in the UI Full Tests.
The benchmark was based on the amount of hitches detected on an iPhone XS,
where both labels had zero hitches when scrolling a list around 5 times each time we ran the test.
LCLabel is MIT-licensed.
UILabel and UITextView are Apple's own components.




