Вот моя ситуация:Добавить атрибуты NSMutableAttributedString посимвольны
Я в NSMutableAttributedString
без каких-либо атрибутов в текстовом виде. Всякий раз, когда пользователь нажимает клавишу backspace, я не хочу, чтобы символ был удален, я хочу, чтобы он был пробит, как и функция «Отслеживание изменений» в наборах производительности. Я хочу, чтобы пользователь мог продолжить типизацию после этого. Вот как я начал:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if (text.length == 0 && textView.text.length == 0) return YES;
if (text.length == 0 && !([[textView.text substringFromIndex:textView.text.length - 1] isEqualToString:@" "] || [[textView.text substringFromIndex:textView.text.length - 1] isEqualToString:@"\n"])) {
textView.attributedText = [self strikeText:textView.attributedText];
textView.selectedRange = NSMakeRange(textView.attributedText.length - 1, 0);
return NO;
}
return YES;
}
- (NSAttributedString *)strikeText:(NSAttributedString *)text
{
NSRange range;
NSMutableAttributedString *returnValue = [[NSMutableAttributedString alloc] initWithAttributedString:text];
if (![text attribute:NSStrikethroughStyleAttributeName atIndex:text.length - 1 effectiveRange:&range]) {
NSLog(@"%@", NSStringFromRange(range));
NSLog(@"%@", [text attribute:NSStrikethroughStyleAttributeName atIndex:text.length - 1 effectiveRange:&range]);
[returnValue addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(text.length - 1, 1)];
[returnValue addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(text.length - 1, 1)];
}
else {
[returnValue addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(range.location - 1, 1)];
[returnValue addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(range.location - 1, 1)];
}
[returnValue removeAttribute:NSStrikethroughStyleAttributeName range:NSMakeRange(returnValue.length, 1)];
return returnValue;
}
Однако, независимо от того, насколько сильно я думаю, я не могу обернуть мою голову вокруг ситуации. Этот код не работает или работает частично. Значение, возвращаемое attribute: atIndex: effectiveRange:
, всегда равно нулю, не имеет значения, действительно ли атрибут существует или нет. Эффективный диапазон выходит за рамки текста, который у меня есть.
Пожалуйста, помогите мне здесь.
К сожалению, ваш код тоже есть проблемы. Я хочу, чтобы курсор находился в конце пробитого текста. И если я напечатаю что-нибудь еще после того, как какой-то текст был пробит, вновь вставленный текст тоже пробивается. – duci9y
Я объяснил причину вашей проблемы с атрибутом: atIndex: effectiveRange: в первой части. Приведенный код не должен быть полным решением, а направлением для продолжения. – Karl