如何在键入/编辑时制作UITextView滚动

chr*_*hrs 26 uitextview uikit ios ios7

更新 这似乎只是IOS 7的一个问题.已接受的答案已添加了一个很好的解决方法.

我创建了一个包含UITextView和UILabel的自定义控件,其中包含textview的标题,即我的控件.我的控件会自动更改大小以适应textview和标题.在此之前,我更改textview的大小以适合文本.这最佳地工作.

我添加了功能,因此textview会自动滚动到最后一行.或者这至少是我正在尝试的东西.只要最后一行包含除空文本之外的任何内容,它就可以正常工作.如果文本为空,则向下滚动,因此您只能看到光标的大约一半.

我究竟做错了什么?

所以你可以更好地理解我做了一些图像:

这是我输入一个单词并制作一些换行符.(仍然不足以让它滚动)

在进行换行之前

我做了一个休息时间.(按回车键)仔细查看光标如何减半.这是问题!

问题

我已经拍了下一张照片,所以你可以看到我的预期.

我想要的是!

dav*_*sdk 54

其他答案的问题:

  • 当只扫描"\n"时,如果键入的文本行超出文本视图的宽度,则不会进行滚动.
  • 当总是在textViewDidChange:中设置contentOffset时,如果编辑文本的中间部分,则不想滚动到底部.

解决方案是将其添加到文本视图委托:

- (void)textViewDidChange:(UITextView *)textView {
    CGRect line = [textView caretRectForPosition:
        textView.selectedTextRange.start];
    CGFloat overflow = line.origin.y + line.size.height
        - ( textView.contentOffset.y + textView.bounds.size.height
        - textView.contentInset.bottom - textView.contentInset.top );
    if ( overflow > 0 ) {
        // We are at the bottom of the visible text and introduced a line feed, scroll down (iOS 7 does not do it)
        // Scroll caret to visible area
        CGPoint offset = textView.contentOffset;
        offset.y += overflow + 7; // leave 7 pixels margin
        // Cannot animate with setContentOffset:animated: or caret will not appear
        [UIView animateWithDuration:.2 animations:^{
            [textView setContentOffset:offset];
        }];
    }
}
Run Code Online (Sandbox Code Playgroud)


Vik*_*Vik 8

我试着把你的textViewDidChange:一个片段放进去:

if([textView.text hasSuffix:@"\n"])
    [self.textView setContentOffset:CGPointMake(0,INT_MAX) animated:YES];
Run Code Online (Sandbox Code Playgroud)

它不是很干净,我正在努力寻找一些更好的东西,但现在它起作用了:D

更新:由于这是仅在iOS 7(Beta 5,现在)上发生的错误,您可以使用以下代码进行解决方法:

if([textView.text hasSuffix:@"\n"]) { 
    double delayInSeconds = 0.2; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
        CGPoint bottomOffset = CGPointMake(0, self.textView.contentSize.height - self.textView.bounds.size.height); 
        [self.textView setContentOffset:bottomOffset animated:YES]; 
    }); 
}
Run Code Online (Sandbox Code Playgroud)

然后,在iOS 6上,您可以选择将延迟设置为0.0或仅使用块的内容.