如何在UITextView中输入不同颜色的字符串使用不同的语言

时间:2017-11-08 12:04:26

标签: ios objective-c uitextview nsattributedstring

我想选择颜色然后更改当前输入的UITextView的文字颜色使用不同的语言

但我遇到了以下问题

1.无法找到最后输入的文字

Demo picture

例如,在这种情况下,我还没有确认输入的文本,但它已经执行了方法

- (BOOL)textView:(UITextView *) textView shouldChangeTextInRange: (NSRange)range replacementText: (NSString *)text

我想这是第一个创建一系列字符,确认输入字的选择,然后替换它

但是,我不需要这个输入字符范围,这会影响我需要更改单词颜色的NSRange参数

所以我将颜色函数更改为textViewDidChange方法,但它导致我删除崩溃

2.为什么除英语以外的其他语言不执行方法

- (void)insertText:(NSString *)text

这是我的演示链接https://github.com/xueyefengbao/Demo.git

谁可以帮助我解决问题或修改我在演示中提到的功能?

非常感谢:)

在trungduc的建议之后,我更改了代码

仍然发现一些小问题

wrong

correct

无法连续进入

Continuous input error

1 个答案:

答案 0 :(得分:0)

对于你的问题。

  • 无法找到上次输入的文字 - 似乎您在删除前忘了重置lastRange。但你不再使用它,所以我们可以忽略它。

  • 为什么除英语之外的其他语言不执行方法这是因为在您的语言中,在某些情况下输入字符时,它不会总是向字符串添加字符。实际上,它用另一个字符替换了最后一个字符。它使得从lastRange获得的shouldChangeTextInRange超出了textView上当前文本的范围。我的解决方案是在使用[attributedString addAttribute:NSForegroundColorAttributeName value:self.currentColor range:self.lastRange];之前,您应该检查并更正self.lastRange

您可以尝试使用以下代码替换您的方法。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if (text.length == 0) {
        self.lastRange = NSMakeRange(0, 0); // Reset lastRange when deleting
        return YES;
    }
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
    }

    BOOL result = [self doesFit:textView string:text range:range];

    if (result) {
        self.lastRange = NSMakeRange(range.location, text.length);
    }
    return result;
}

- (void)resetCorrectFontStyle:(UITextView *)textView  {

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];

    paragraphStyle.lineSpacing = (textView.textContainer.size.height - (textView.font.lineHeight)*23)/23;
    paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping;

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithAttributedString:textView.attributedText];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, textView.attributedText.length)];

    // Check if lastRange can't be used with current text, correct location of lastRange
    if (_lastRange.length + _lastRange.location > textView.text.length) {
      _lastRange = NSMakeRange(_lastRange.location - 1, _lastRange.length);
    }

    [attributedString addAttribute:NSForegroundColorAttributeName value:self.currentColor range:self.lastRange];

    _keyboardTextView.attributedText = attributedString;
}

希望这有帮助。