2013-04-01 2 views
3

У нас есть простой парсер разметки в нашем приложении iOS, который берет текст с HTML-подобными тегами и преобразует его в NSAttributedString, итерируя по каждому символу простым NSString и создавая NSMutableAttributedString.Содержит ли NSMutableAttributedString одинаковые смежные атрибуты?

В худшем случае, когда мы добавили новый набор атрибутов для каждого отдельного символа, когда мы повторяли строку, мог бы быть достаточно интеллектуальным, чтобы объединить одинаковые смежные диапазоны атрибутов и оптимизировать? Или это было бы ужасно неэффективным и медленным, чтобы отобразить в основном тексте?

Я не предлагаю, что это хороший алгоритм в целом! Я просто смотрю на худший сценарий и задаюсь вопросом, имеет ли у NSMutableAttributedString встроенное интеллектуальное поведение?

+0

Вы уже поняли это? У меня есть аналогичный код, запущенный в моем приложении, и я мог бы подать его на ввод, чтобы вызвать это поведение и посмотреть, какой результат я получаю. – arlomedia

+0

Нет, не узнал. Игнорировал проблему, потому что это не вызывало никаких проблем, но я все равно хотел бы знать ответ! –

ответ

3

Я просто пытался что-то вроде этого (упрощенная версия моего реального кода):

NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"Testfoobarhey"]; 
UIFont *font = [UIFont fontWithName:@"Georgia-Bold" size:12.0]; 
[text addAttribute:NSFontAttributeName value:font range:NSMakeRange(4, 3)]; 
[text addAttribute:NSFontAttributeName value:font range:NSMakeRange(7, 3)]; 

Другими словами, я добавил два смелых атрибуты прямо рядом друг с другом. Тогда я смотрел результат:

NSLog(@"%@", text); 

И выход показал три куски текста: «Test» обычным шрифтом, «Foobar» выделены жирным шрифтом, и «эй» обычным шрифтом.

Итак, чтобы ответить на ваш вопрос, да, похоже, что два смежных диапазона форматирования были автоматически объединены в NSMutableAttributedString.

P.S. В соответствующей заметке я заметил, что если я применяю атрибут с диапазоном, который распространяется на разрыв строки, в результате NSAttributedString будет иметь один атрибут перед разрывом строки, а другой после, а сам разрыв строки не будет атрибутов. Поэтому, если вы когда-либо разбираете одного персонажа за раз, вам, возможно, придется компенсировать это.

+0

Ницца. Я также просто попробовал простой тест на добавление другого 'NSAttributedString', и он также правильно связал атрибуты с этим. –

Смежные вопросы