Кастомизация сокращений UILabel

Одним из самых используемых компонентов UI является UILabel. По частоте использования он вполне может соперничать с такими гигантами, как UITableView и UICollectionView. И в большинстве случаев возможностей стандартного UILabel хватает. Однако если дизайнеры не желают видеть в приложении обычное троеточие в качестве сокращения строки, то разработчику придется столкнуться с некоторыми сложностями, поскольку UILabel не имеет метода для указания токена в качестве сокращения.

Далее будет предложено расширение стандартных возможностей UILabel для возможности кастомизации truncationToken. В качестве примера будет представлен label, при нажатии на который отображается весь текст.

Truncation token

Очевидно, что для того, чтобы указывать токен сокращения, необходимо добраться до того уровня абстракции, на котором происходит отрисовка текста. Поэтому потребуется переопределить метод drawText(in:). Также стоит обратить внимание на CoreText framework и его метод CTLineCreateTruncatedLine(_:_:_:_:). Четвертым аргументом передается строка CTLine, которая используется для сокращения (truncationToken). Это именно то, что нужно. Осталась достаточно тривиальная задача — отрисовать текст средствами CoreText.

Стоит обратить внимание на то, что текст в UILabel передается двумя способами — с помощью полей text и attributedText. Во втором случае все ясно. Как разработчик сформировал NSAttributedString, таким attriubtedText и будет. Однако в первом случае при обращении к полю attributedText UILabel автоматически сгенерирует атрибуты на основе заданных параметров (font, textColor и т.д.).

Проблема заключается в том, что сгенерированные автоматически атрибуты содержат табы, из-за которых метод CTFrameGetLines(_:) возвращает неправильное количество строк. Поэтому был разработан метод removeTabsFrom(_:), который задает атрибут .paragraphStyle стандартным значением.

Также на основе rect параметра требуется создать frame, совместимый с api CoreText.

И собственно то, ради чего проектировался данный класс — формирование пользовательского сокращения. Все остальное UIKit автоматически расчитает сам.

В итоге у разработчика в арсенале еще один полезный, а в некоторых случаях и необходимый инструмент.

Заключение

Работа с текстом — частый гость в повестке дня разработчика мобильного приложения. В данной стате не была освещена тема кастомизации сокращений для UITextView. Также предложенный подход не учитывает сокращение в середине или начале строки.

Пожалуй то, как подобное реализовать в данных вариантах — отличные темы для следующих статей. А пока у меня все, желаю хорошего дня.

--

--

--

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Ace Rodstin

Ace Rodstin

More from Medium

Prevent Homebrew services from starting automatically

Code Design Masterclass With Dave Abrahams

SectionedFetchRequest, sweet, sweet automagic goodness!

Avoid “Keyboard hiding TextField” Problem in iOS using Protocol