9

在以前版本的 iOS 中,我UITextView将使用滚动到底部

[displayText scrollRangeToVisible:NSMakeRange(0,[displayText.text length])];

或者

CGFloat topCorrect = displayText.contentSize.height -[displayText bounds].size.height;
topCorrect = (topCorrect<0.0?0.0:topCorrect);
displayText.contentOffset = (CGPoint){.x=0, .y=topCorrect};

但是前者现在会产生奇怪的效果,即每次我将文本附加到视图时,都会从长文本的顶部开始动画滚动到底部。添加文本时有没有办法弹出到文本底部?

4

5 回答 5

3
textView.scrollEnabled = NO;
[textView scrollRangeToVisible:NSMakeRange(textView.text.length - 1,0)];
textView.scrollEnabled = YES;

这在 iOS 7.1.2 中确实对我有用。

于 2014-08-12T15:50:05.400 回答
3

对于未来的旅行者,在@mikeho 的帖子的基础上,我发现了一些对我有用的东西,但更简单一些。

1)确保您UITextViewcontentInsets 设置正确,并且您的 textViewfirstResponder()在执行此操作之前已经存在。
2)在我的插图准备就绪并且光标处于活动状态后,我调用以下函数:

private func scrollToCursorPosition() {
    let caret = textView.caretRectForPosition(textView.selectedTextRange!.start)
    let keyboardTopBorder = textView.bounds.size.height - keyboardHeight!

   // Remember, the y-scale starts in the upper-left hand corner at "0", then gets
   // larger as you go down the screen from top-to-bottom. Therefore, the caret.origin.y
   // being larger than keyboardTopBorder indicates that the caret sits below the
   // keyboardTopBorder, and the textView needs to scroll to the position.
   if caret.origin.y > keyboardTopBorder {
        textView.scrollRectToVisible(caret, animated: true)
    }
 }
于 2015-08-06T19:24:46.637 回答
2

我相信这是 iOS 7 中的一个错误。在 UITextView 上切换 scrollEnabled 似乎可以修复它:

[displayText scrollRangeToVisible:NSMakeRange(0,[displayText.text length])];
displayText.scrollEnabled = NO;
displayText.scrollEnabled = YES;
于 2014-02-25T22:36:46.097 回答
0

我认为您的参数在NSMakeRange. 位置是第一个,然后你要选择多少(长度)。

NSMakeRange(0,[displayText.text length])

...将创建一个从第 0 个(第一个?)字符开始并贯穿整个字符串长度的选择。要滚动到底部,您可能只想在最后选择一个字符。

这在带有 Xcdoe 5.1.1 的 iOS SDK 7.1 中对我有用。

[textView scrollRangeToVisible:NSMakeRange(textView.text.length - 1,0)];
textView.scrollEnabled = NO;
textView.scrollEnabled = YES;

我这样做是因为我以编程方式添加文本,并且文本视图像终端或命令行输出一样位于底部。

于 2014-07-29T03:55:04.947 回答
0

最好的方法是为UITextView. 它不会触发滚动,并且会立即重新定位可见的内容。您可以通过找到插入符号的位置然后重新定位来做到这一点:

- (void)userInsertingNewText {
    UITextView *textView;
    // find out where the caret is located
    CGRect caret = [textView caretRectForPosition:textView.selectedTextRange.start];
    // there are insets that offset the text, so make sure we use that to determine the actual text height
    UIEdgeInsets textInsets = textView.textContainerInset;
    CGFloat textViewHeight = textView.frame.size.height - textInsets.top - textInsets.bottom;
    // only set the offset if the caret is out of view
    if (textViewHeight < caret.origin.y) {
        [self repositionScrollView:textView newOffset:CGPointMake(0, caret.origin.y - textViewHeight)];
    }
}

/**
 This method allows for changing of the content offset for a UIScrollView without triggering the scrollViewDidScroll: delegate method.
 */
- (void)repositionScrollView:(UIScrollView *)scrollView newOffset:(CGPoint)offset {
    CGRect scrollBounds = scrollView.bounds;
    scrollBounds.origin = offset;
    scrollView.bounds = scrollBounds;
}
于 2015-06-26T21:32:36.923 回答