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)
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 .lclabelLink instead of .link when creating your NSAttributedString
2- Setting linkStyleValidation to be .ensure which will force the NSTextStorage to either replace all the instances of .link with .lclabelLink or takes values of linkAttributes and sets them to the Storage.
linkAttributes would only be set if .ensure was set.
Getting started
git clone https://github.com/mustiikhalil/LCLabel
cd LCLabel
open DemoApp/DemoApp.xcodeproj
// or
open package.swift
LCLabel has three schemas to build
LCLabel // Lib
DemoApp // Demo app & test cases
UI Full Tests // UITests that includes hitches tests
DemoApp explains how to use LCLabel
DemoApp can be ran in three modes, -scrollview, -autolayout and default. You will need to pass the arguments as Arguments Passed On Launch
UI Full Tests shows that LCLabel doesnt have any hitches
The following was compared on an iPhone xs with a baseline of UILabel
Performance
Memory
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.
Scrolling
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
LCLabel is a TextKit 2 based UILabel that mimics a the behaviour of UITextView
Installation
Swift Package Manager
How to use:
or incase AutoLayout is being used
Notes:
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
.lclabelLink
instead of.link
when creating your NSAttributedString2- Setting
linkStyleValidation
to be.ensure
which will force the NSTextStorage to either replace all the instances of.link
with.lclabelLink
or takes values oflinkAttributes
and sets them to the Storage.linkAttributes
would only be set if.ensure
was set.Getting started
LCLabel
has three schemas to buildDemoApp
explains how to use LCLabelDemoApp
can be ran in three modes,-scrollview
,-autolayout
anddefault
. You will need to pass the arguments asArguments Passed On Launch
UI Full Tests
shows that LCLabel doesnt have any hitches The following was compared on an iPhone xs with a baseline of UILabelPerformance
Memory
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 the1.23 MiB
UILabel.Scrolling
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.License
LCLabel
is MIT-licensed.Disclaimer
UILabel and UITextView are Apple’s own components.