将光标位置移到UITextView文本末尾并滚动到该位置

6
使用下面的代码,我将plist中的文本放入了textView中。textView还没有成为第一响应者;这段文本最初只是用于阅读。在iOS4中,goToEndOfNote代码会将光标定位在文本末尾并滚动到该位置。但在3.1.3中,它直到屏幕被触摸后才滚动到末尾(除非需要进行更改或添加),这时textView才成为第一响应者。我希望它能像在4.0中那样在3.1.3中工作。请问有什么想法吗?谢谢。
    ...
    self.temp = [[[NSMutableArray alloc] initWithContentsOfFile:myPlistPath] autorelease]; 
    self.textView.text = [self.temp objectAtIndex:0];
    [self goToEndOfNote];
    //[self performSelector:@selector(goToEndOfNote) withObject:nil afterDelay:0.1];
}

- (void) goToEndOfNote {
    NSUInteger length = self.textView.text.length;  
    self.textView.selectedRange = NSMakeRange(length, 0);
}
4个回答

3

我在我的一个应用程序中使用setContentOffset:animated来滚动到UITextView的顶部。同样适用于滚动到底部。尝试以下代码:

- (void) goToEndOfNote {
    NSUInteger length = self.textView.text.length;  
    self.textView.selectedRange = NSMakeRange(length, 0);
    [textView setContentOffset:CGPointMake(0, length) animated:YES];
}

您还可以将其包装起来,以便仅在3.1.3及以下版本中发生:

- (void) goToEndOfNote {
    NSUInteger length = self.textView.text.length;  
    self.textView.selectedRange = NSMakeRange(length, 0);
    NSString* systemVersion = [[UIDevice currentDevice] systemVersion];
    float version = [systemVersion floatValue];
    if (version < 3.2) {
        [textView setContentOffset:CGPointMake(0, length) animated:YES];
    }
}

几乎但不完全。TextView 占据了大部分屏幕。在 4.0 版本中,添加的行 [textView setContentOffset:CGPointMake(0, length) animated:YES]; 导致最后一个字符滚动到 textView 底部(很好)。在 3.1.3 版本中,它会导致最后一个字符滚动到屏幕中间位置(可以),但在两个操作系统版本中,如果屏幕上只有 1 或 2 行,则它们会被滚动到屏幕外(不太好)。我希望滚动仅在屏幕上有足够多的内容时才开始(就像在我的方法中只有 2 行原始文本时在 4.0 版本中一样)。 - Matt Winters

2

不确定这是否是最佳答案,但它有效。

在3.1.3版本中,原始代码的光标位于末尾,但滚动条在顶部。在4.0版本中,两者都在底部。

NSUInteger length = self.textView.text.length;
self.textView.selectedRange = NSMakeRange(length, 0);

我注意到在3.1.3中,将0和长度交换后,滚动条在底部,但光标在顶部。

NSUInteger length = self.textView.text.length;
self.textView.selectedRange = NSMakeRange(0, length); 

将两者结合起来工作了。它滚动到底部 NSMakeRange(0, length) 可能是到范围的末尾,然后 NSMakeRange(length, 0) 将光标放在那里,所有这些都没有改变它在4.0中的行为。
NSUInteger length = self.textView.text.length;
self.textView.selectedRange = NSMakeRange(0, length); 
self.textView.selectedRange = NSMakeRange(length, 0);

1

虽然已经很晚了,但我找到了解决方案。这需要一点小技巧。

- (void) textViewDidBeginEditing:(UITextView*)textview
{
   [self performSelector:@selector(placeCursorAtEnd:) withObject:textview afterDelay:0.01];
}

- (void)placeCursorAtEnd:(UITextView *)textview
{
     NSUInteger length = textview.text.length;

    textview.selectedRange = NSMakeRange(length, 0);

    [textView setContentOffset:CGPointMake(0, length) animated:YES];
}

使用dispatch_after()更加简洁,因为它可以节省一个方法并且保持触发和动作在一起。 - meaning-matters

1
你可以使用[UITextView -setSelectedRange:]方法来设置一个(位置=TEXT_VIEW_STRING_LENGTH,长度=0)的范围,将光标移动到文本末尾,然后使用相同的范围调用[UITextView -scrollRangeToVisible:]方法将光标滚动到可见区域。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接