Swift 3 получает атрибуты подстроки textview

У меня есть текстовое представление, содержащее несколько абзацев. Каждая строка может быть отформатирована по-разному, например, некоторые строки выделены полужирным шрифтом, а другие — курсивом.

Как мне получить атрибуты для определенной подстроки и получить атрибуты для подстроки перед этой?

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

Вот что у меня есть до сих пор.

let range: UITextRange = textView.selectedTextRange!
let selectedText = textTV.text(in: range)
let previousRange: UITextRange = textView.textRange(from: textView.beginningOfDocument, to: range.start)!
let previousText = textTV.text(in: previousRange)

Благодаря этому я смог получить строку, выбранную пользователем. Как и текст, стоящий за ним.

Однако я не знаю, как вырвать атрибуты этой строки.


person mocode10    schedule 22.06.2017    source источник
comment
Используйте свойство attributedText текстового представления.   -  person rmaddy    schedule 23.06.2017
comment
Это вернет атрибутированный текст для всего текстового представления, не так ли? Мне нужно получить несколько свойств текста с атрибутами, поскольку каждая строка может иметь свои собственные атрибуты, которые отличаются друг от друга.   -  person mocode10    schedule 23.06.2017
comment
Затем вы можете использовать attributedSubstring, чтобы получить желаемую порцию.   -  person rmaddy    schedule 23.06.2017


Ответы (2)


Вы можете перечислить атрибуты и применить их к новому тексту:

textView.attributedText.enumerateAttributes(in: textView.selectedRange, options: .longestEffectiveRangeNotRequired) { (attributes, range, stop) in
    // do what you need
}

Описание:

Выполняет блок для каждого атрибута в диапазоне. Если этот метод отправляется экземпляру NSMutableAttributedString, мутация (удаление, добавление или изменение) разрешена, если она находится в пределах диапазона, предоставленного блоку; после мутации перечисление продолжается с диапазоном, непосредственно следующим за обработанным диапазоном, после того как длина обработанного диапазона скорректирована с учетом мутации. (Перечислитель в основном предполагает, что любое изменение длины происходит в указанном диапазоне.) Например, если блок вызывается с диапазоном, начинающимся с местоположения N, и блок удаляет все символы в предоставленном диапазоне, следующий вызов также пройдет N как индекс диапазона.

person Vasilii Muravev    schedule 22.06.2017
comment
Это очень полезно. Определенно толчок в правильном направлении. - person mocode10; 23.06.2017
comment
Пожалуйста. Если это было действительно полезно, проголосуйте, пожалуйста :) - person Vasilii Muravev; 23.06.2017

Если вы просто ищете текст с атрибутами для данного диапазона и у вас есть подкласс NSLayoutManager, вы можете вызвать textStorage.attributedSubstring(from: glyphRange). Здесь glyphRange происходит от метода enumerateLineFragments, вызываемого из подкласса NSLayoutManager.

Просто выкладываю, вдруг кому понадобится!

person Joseph Francis    schedule 24.05.2020