Как Красиво Выделить Uitextview



Постановка задачи Дано: многострочный текст. Находка: красиво оформленный фон.

«Да, это продлится всего час», — подумал я.

«Вам просто нужно поместить фоновый цвет в атрибутный текст».

Но этого было недостаточно.

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

Уродливый.

Решение - нужен индивидуальный! Тернистый путь его создания натолкнул меня на мысль описать процесс, чтобы будущим поколениям не пришлось так сильно страдать.

Для тех, кто заинтересован, пожалуйста, обратитесь к кат.



Принятие

Первым действием было классическое обращение в Интернете с вопросом о правильности выполнения.

В ответ поступило несколько предложений.

В самых адекватных все сводилось к переопределению метода fillBackgroundRectArray. В обычной жизни он отвечает за окраску текста при активации упомянутого выше свойства AttributeText. Чтобы посмотреть, что это за зверь, я попробовал готовое решение в надежде, что задача все равно займет пару часов.

Ничего не вышло.

Решение сделало что угодно.



Документация решает все

Решив больше так не делать, я обратился к документации.

Отсюда стало понятно, что UITextView — это простой наследник UIScrollView для текста, которым управляют три товарища:

  • NSTextStorage — это, по сути, оболочка над NSMutableAtributedString, необходимая для хранения текста и его атрибутов;
  • NSTextContainer — это NSObject, отвечающий за геометрическую фигуру, в которой представлен текст. По умолчанию это прямоугольник, настроить можно что угодно;
  • NSLayoutManager — управляет первыми двумя: берет текст, делает его отступы, делит на абзацы, а также отвечает за нужную нам штриховку.



Алгоритмы — это круто

В итоге задача сводится к созданию кастомного NSLayoutManadger и переопределению в нем нужного метода.

   

class SelectionLayoutManager: NSLayoutManager { override func fillBackgroundRectArray(_ rectArray: UnsafePointer<CGRect>, count rectCount: Int, forCharacterRange charRange: NSRange, color: UIColor) {

Теги: #разработка для iOS #разработка для iOS #разработка для iOS #дизайн для iOS #iOS UITextView #UITextView #NSLayoutManager
Вместе с данным постом часто просматривают: