web-dev-qa-db-ja.com

UITextViewを下にスクロール

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);
27
Jonis

UITextViewについて話している場合は、次のコードを使用できます。

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

}

Swift 4:

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

IOS 7以上で問題がある場合は、これを試してください。 this SO answer を参照してください。

- (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];
}
13
Hong Duan

Swift 3

let bottom = self.textView.contentSize.height - self.textView.bounds.size.height
self.textView.setContentOffset(CGPoint(x: 0, y: bottom), animated: true)
7
zeeawan

デリゲートメソッドを実装する必要があります。以下のコードは、改行が入力されているかどうかを確認し、入力されている場合は、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;
}
5
wolffan

これは私にとってはうまくいきます! :D

CGPoint bottomOffset = CGPointMake(0, self.textView.contentSize.height - self.textView.bounds.size.height);
[self.description1 setContentOffset:bottomOffset animated:YES];
3
Brandon Boynton

スウィフト4

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

// Usage
textView.simple_scrollToBottom()

NSRangeを使用せずに解決策を見つけることはできませんでした。

3
neoneye

エンコーディングを指定して、最後の文字までの範囲を作成し、その範囲までスクロールします。コンテンツによっては、utf8以外が適切な場合があります

let range = NSMakeRange(self.OutputTextView.text.lengthOfBytes(using: String.Encoding.utf8), 0);
self.OutputTextView.scrollRangeToVisible(range);
2
Chris Amelinckx

下にスクロールするための一般的なアプローチとして、UIScrollViewで実行できます。

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

これは、UITextView、UITableViewなどのUIScrollViewのすべての子孫で機能します。

2
ArunGJ

Swift version of @ Hong Duan answer

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
    }
}
0
yoAlex5
textView.scrollRangeToVisible(NSRange(..<textView.text.endIndex, in: textView.text))

このソリューションは、わずかに異なるいくつかの注目すべきことを実行します。

  • String.Indexインターフェース(例:.count
  • 明示的な範囲の開始位置を回避するPartialRangeUpToを使用して、コードを簡潔な1行に削減
0