2013-11-12 4 views
0

Я пишу приложение, которое занимается редактированием расширенного текста с использованием UITextView. Он использует NSTextStorage для установки новых атрибутов для частей строки. Однако в том случае, если пользователь хочет изменить шрифт или размер шрифта в конце строки для нового стиля текста или в середине строки (другими словами, если диапазон, пройденный до setAttributes:range:, имеет длину 0) это невозможно сделать, потому что вы не можете установить атрибуты с диапазоном 0. Так что, как я могу установить новый UIFont для позиции курсора в UITextView?Установить новый шрифт в конце NSTextStorage NSMutableAttributedString

соответствующий код из моего NSTextStorage подкласса:

- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range 
{ 
NSLog(@"setAttributes:%@ range:%@", attrs, NSStringFromRange(range)); 

[self beginEditing]; 
[_backingStore setAttributes:attrs range:range]; 

[_backingStore fixAttributesInRange:range]; 

[self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; 
[self endEditing]; 
} 

ответ

1

Fixed его! То, что я закончил, заключалось в добавлении переменной экземпляра tempAttributes в мой подкласс NSTextStorage. Если я попытался установить атрибуты строки с диапазоном 0, я установил tempAttributes на атрибуты, передаваемые в. Затем на следующем проходе метода, если у tempAttributes были данные, я задал диапазон, который он пытался изменить, вместо этого старых атрибутов. Новый код:

- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range 
{ 
    NSLog(@"setAttributes:%@ range:%@", attrs, NSStringFromRange(range)); 

[self beginEditing]; 
if (range.location == _backingStore.length || range.length == 0) { 
    tempAttributes = attrs; 
} else { 
    if (tempAttributes) { 
     [_backingStore setAttributes:tempAttributes range:range]; 
     tempAttributes = nil; 
    } else { 
     [_backingStore setAttributes:attrs range:range]; 
    } 
} 

[_backingStore fixAttributesInRange:range]; 

[self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; 
[self endEditing]; 
} 
0

Я сделал намного лучше. Я просто назову [myTextView insertText: @ ""], который добавляет пробел в текстовое хранилище, а range.length больше не == 0. Затем я делаю все, что мне нужно, с этим диапазоном текста. И после этого я сразу вызываю [myTextView deleteBackward: nil]. Вы не могли ничего увидеть, даже если вы Супермен, но этот трюк сделает все, что вам нужно, с пустым диапазоном.

3

Правильный способ сделать это - установить typingAttributes свойство UITextView.

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