31

我正在制作一个有一个UITextView和一个按钮的应用程序。

当我单击按钮时,一些文本将添加到UITextView.

但是当单击按钮时,我不想向下滚动到文本字段的底部,以便用户可以看到最后添加的文本。

如何使UITextView向下滚动到底部?

我试过了:

int numLines = LogTextView.contentSize.height / LogTextView.font.lineHeight+1;
NSLog(@"%d",numLines);

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

但它不会工作......

我也试过:

self.LogTextView.contentSize=CGSizeMake(length,0);
4

10 回答 10

80

如果您正在谈论 UITextView,您可以使用以下代码:

-(void)scrollTextViewToBottom:(UITextView *)textView {
     if(textView.text.length > 0 ) {
        NSRange bottom = NSMakeRange(textView.text.length -1, 1);
        [textView scrollRangeToVisible:bottom];
     }

}

斯威夫特 4:

func scrollTextViewToBottom(textView: UITextView) {
    if textView.text.count > 0 {
        let location = textView.text.count - 1
        let bottom = NSMakeRange(location, 1)
        textView.scrollRangeToVisible(bottom)
    }
}
于 2013-05-22T18:09:56.560 回答
17

如果您在 iOS 7 或更高版本上遇到问题,请尝试此操作。看到这个答案

- (void)scrollTextViewToBottom:(UITextView *)textView {
    NSRange range = NSMakeRange(textView.text.length, 0);
    [textView scrollRangeToVisible:range];
    // an iOS bug, see https://stackoverflow.com/a/20989956/971070
    [textView setScrollEnabled:NO];
    [textView setScrollEnabled:YES];
}
于 2015-10-18T05:09:05.713 回答
9

使用斯威夫特 3

let bottom = self.textView.contentSize.height - self.textView.bounds.size.height
self.textView.setContentOffset(CGPoint(x: 0, y: bottom), animated: true)
于 2017-02-27T04:51:51.353 回答
6

斯威夫特 5

extension UITextView {
    func simple_scrollToBottom() {
        let textCount: Int = text.count
        guard textCount >= 1 else { return }
        scrollRangeToVisible(NSRange(location: textCount - 1, length: 1))
    }
}

// Usage
textView.simple_scrollToBottom()
于 2018-02-27T10:22:21.987 回答
4

您必须实现一个委托方法。下面的代码检查是否输入了换行符,如果是,则滚动到 textView 的底部:

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

    if ([text isEqualToString:@"\n"]) {
        textView.contentOffset = CGPointMake(0.0, textView.contentSize.height);
    }
    return YES;
}
于 2014-02-04T12:33:48.787 回答
4

创建一个范围,指定编码,到最后一个字符,然后滚动到该范围 utf8 以外的其他内容可能适合您的内容

let range = NSMakeRange(self.textView.text.lengthOfBytes(using: .utf8), 0);
self.textView.scrollRangeToVisible(range);
于 2017-06-21T02:28:55.213 回答
3

这对我有用!:D

CGPoint bottomOffset = CGPointMake(0, self.textView.contentSize.height - self.textView.bounds.size.height);
[self.description1 setContentOffset:bottomOffset animated:YES];
于 2014-01-19T19:50:01.997 回答
3

作为滚动到底部的通用方法,它可以在 UIScrollView 上完成。

extension UIScrollView {
    func scrollToBottom() {
        let contentHeight = contentSize.height - frame.size.height
        let contentoffsetY = max(contentHeight, 0)
        setContentOffset(CGPoint(x: 0, y: contentoffsetY), animated: true)
    }
}

这将适用于 UIScrollView 的所有后代,如 UITextView、UITableView 等。

于 2018-01-28T17:34:52.270 回答
1
textView.scrollRangeToVisible(NSRange(..<textView.text.endIndex, in: textView.text))

这个解决方案做了一些稍微不同的值得注意的事情:

  • 利用String.Index接口(可能比 eg 更高效.count
  • 使用PartialRangeUpTo避免显式范围起始位置的 a,将代码简化为干净的单行代码
于 2020-01-10T20:28:25.287 回答
0

@Hong Duan的 Swift 版本回答

func scrollTextViewToBottom(textView: UITextView) {
    if textView.text.count > 0 {
        let location = textView.text.count - 1
        let bottom = NSMakeRange(location, 1)
        textView.scrollRangeToVisible(bottom)

        // an iOS bug, see https://stackoverflow.com/a/20989956/971070
        textView.isScrollEnabled = false
        textView.isScrollEnabled = true
    }
}
于 2019-09-19T14:01:42.540 回答