UITextField shouldChangeTextInRange with attributedText导致滚动奇怪的行为

时间:2013-01-29 22:19:26

标签: ios uitextview nsattributedstring uitextviewdelegate

我需要在渲染之前捕获键入的文本,以便为其应用一些属性。

为此我正在使用UITextView的委托方法shouldChangeTextInRange以及NSAttributedString。到目前为止一切都很好,而且很有效。

问题是,当UITextView获取一定数量的文本并开始滚动时,更改attributionText会使其滚动到顶部,而下一个char会使其滚动回到最后。

在打字时,它继续上下移动......

设置textview.text,而不是属性文本,它适用于

有什么建议吗?

提前致谢。

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

    NSAttributedString * newString = [[NSAttributedString alloc] initWithString:text attributes:nil];
    NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithAttributedString:_textView.attributedText];

    [string insertAttributedString:newString atIndex:range.location];

    textView.attributedText = string;

    range.location += text.length;

    textView.selectedRange = range;

    return NO;
}

2 个答案:

答案 0 :(得分:0)

我不确定shouldChangeTextInRange的重点,但要修复不受欢迎的自动滚动,请尝试使用textView.attributedText围绕[textView setScrollEnabled:NO]的设置。

那是:

[textView setScrollEnabled:NO];
textView.attributedText = string;
range.location += text.length;
[textView setScrollEnabled:YES];

答案 1 :(得分:0)

textView.layoutManager.allowsNonContiguousLayout = NO;

然后在更改attributedText时不会滚动到顶部。 它对我有用。