330

UIScrollViewコード内で一番下までスクロールするにはどうすればよいですか? または、より一般的な方法で、サブビューの任意のポイントに?

4

30 に答える 30

675

UIScrollView のsetContentOffset:animated:関数を使用して、コンテンツ ビューの任意の部分にスクロールできます。scrollView が であると仮定して、下にスクロールするコードを次に示しますself.scrollView

目的 C:

CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];

迅速:

let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)

それが役立つことを願っています!

于 2009-06-04T19:58:17.213 に答える
153

簡単にコピーして貼り付けるための受け入れられた回答の迅速なバージョン:

let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
scrollView.setContentOffset(bottomOffset, animated: true)
于 2015-04-02T11:49:31.420 に答える
54

最も簡単な解決策:

[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];
于 2014-03-07T08:41:02.167 に答える
28

既存の回答を強化するだけです。

CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];

下部のインセットも処理します (キーボードが表示されているときにスクロール ビューを調整するためにそれを使用している場合)。

于 2013-09-06T11:33:51.363 に答える
19

コンテンツ オフセットをコンテンツ サイズの高さに設定するのは正しくありません。コンテンツの下部がスクロール ビューの上部にスクロールされるため、見えなくなります。

正しい解決策は、次のように、コンテンツの下部をスクロール ビューの下部にスクロールすることです (svは UIScrollView です)。

CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
if (sv.contentOffset.y + bsz.height > csz.height) {
    [sv setContentOffset:CGPointMake(sv.contentOffset.x, 
                                     csz.height - bsz.height) 
                animated:YES];
}
于 2011-06-11T17:32:57.990 に答える
16

contentInset考慮した Swift 2.2 ソリューション

let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)

これは拡張機能に含まれている必要があります

extension UIScrollView {

  func scrollToBottom() {
    let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom)
    setContentOffset(bottomOffset, animated: true)
  }
}

bottomOffset.y > 0スクロールする前に確認したい場合があることに注意してください

于 2016-07-07T09:27:07.650 に答える
15

contentSizeが より低い場合はどうなりboundsますか?

Swift の場合は次のとおりです。

scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
于 2016-01-16T19:56:25.167 に答える
13

トップにスクロールします

- CGPoint topOffset = CGPointMake(0, 0);
- [scrollView setContentOffset:topOffset animated:YES];

下にスクロール

- CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - self.scrollView.bounds.size.height);
 - [scrollView setContentOffset:bottomOffset animated:YES];
于 2012-02-17T09:40:08.227 に答える
7

UITableview (UIScrollView のサブクラス) を使用している場合に、これを行う別の便利な方法も見つけました。

[(UITableView *)self.view scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
于 2009-06-05T15:35:55.697 に答える
7

UIScrollView のsetContentOffset:animated:関数を使用して、Swift で一番下までスクロールします。

let bottomOffset : CGPoint = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
于 2016-01-15T15:15:03.927 に答える
6

(オプション)footerViewとを使用するとcontentInset、解決策は次のようになります。

CGPoint bottomOffset = CGPointMake(0, _tableView.contentSize.height - tableView.frame.size.height + _tableView.contentInset.bottom);
if (bottomOffset.y > 0) [_tableView setContentOffset: bottomOffset animated: YES];
于 2012-01-28T19:59:30.467 に答える
6

何らかの方法で scrollView のcontentSizeを変更する (例: scrollView 内にある stackView に何かを追加する) 場合はscrollView.layoutIfNeeded()、スクロールする前に呼び出す必要があります。それ以外の場合は何もしません。

例:

scrollView.layoutIfNeeded()
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
if(bottomOffset.y > 0) {
    scrollView.setContentOffset(bottomOffset, animated: true)
}
于 2019-11-14T13:47:20.840 に答える
6

迅速:

次のような拡張機能を使用できます。

extension UIScrollView {
    func scrollsToBottom(animated: Bool) {
        let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height)
        setContentOffset(bottomOffset, animated: animated)
    }
}

使用する:

scrollView.scrollsToBottom(animated: true)
于 2019-12-28T15:22:43.457 に答える
3

救助へのカテゴリー!

これを共有ユーティリティヘッダーのどこかに追加します。

@interface UIScrollView (ScrollToBottom)
- (void)scrollToBottomAnimated:(BOOL)animated;
@end

そして、そのユーティリティの実装に:

@implementation UIScrollView(ScrollToBottom)
- (void)scrollToBottomAnimated:(BOOL)animated
{
     CGPoint bottomOffset = CGPointMake(0, self.contentSize.height - self.bounds.size.height);
     [self setContentOffset:bottomOffset animated:animated];
}
@end

次に、たとえば次のように、好きな場所に実装します。

[[myWebView scrollView] scrollToBottomAnimated:YES];
于 2013-03-14T19:18:49.697 に答える
3

valdyr、これがお役に立てば幸いです:

CGPoint bottomOffset = CGPointMake(0, [textView contentSize].height - textView.frame.size.height);

if (bottomOffset.y > 0)
 [textView setContentOffset: bottomOffset animated: YES];
于 2010-10-29T07:41:05.137 に答える
1

解決策は私には正しいようにMatt思えますが、設定されているコレクションがある場合は、コレクション ビューのインセットも考慮する必要があります。

適応されたコードは次のようになります。

CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
NSInteger bottomInset = sv.contentInset.bottom;
if (sv.contentOffset.y + bsz.height + bottomInset > csz.height) {
    [sv setContentOffset:CGPointMake(sv.contentOffset.x, 
                                     csz.height - bsz.height + bottomInset) 
                animated:YES];
}
于 2014-06-17T14:09:27.620 に答える
1

コンテンツの下部が表示されるようにする良い方法は、次の式を使用することです。

contentOffsetY = MIN(0, contentHeight - boundsHeight)

これにより、コンテンツの下端が常にビューの下端と同じかそれより上になります。これMIN(0, ...)が必要なのは、 UITableView(そしておそらく)ユーザーが目に見えるスナップによってスクロールしようとするときUIScrollViewを確実にするためです。これは、ユーザーにとってかなり奇妙に見えます。contentOffsetY >= 0contentOffsetY = 0

これを実装するコードは次のとおりです。

UIScrollView scrollView = ...;
CGSize contentSize = scrollView.contentSize;
CGSize boundsSize = scrollView.bounds.size;
if (contentSize.height > boundsSize.height)
{
    CGPoint contentOffset = scrollView.contentOffset;
    contentOffset.y = contentSize.height - boundsSize.height;
    [scrollView setContentOffset:contentOffset animated:YES];
}
于 2013-03-27T08:34:05.903 に答える
1

アニメーションが必要ない場合、これは機能します:

[self.scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX) animated:NO];
于 2014-01-16T15:44:28.153 に答える
0

を追加UITableViewControllerした後、で使用しようとしたときに機能しませんでした。境界線からスクロールして、黒い画面を表示します。self.tableView (iOS 4.1)footerView

代替ソリューション:

 CGFloat height = self.tableView.contentSize.height; 

 [self.tableView setTableFooterView: myFooterView];
 [self.tableView reloadData];

 CGFloat delta = self.tableView.contentSize.height - height;
 CGPoint offset = [self.tableView contentOffset];
 offset.y += delta;

 [self.tableView setContentOffset: offset animated: YES];
于 2010-10-27T12:55:32.740 に答える
0

テキストの実際のサイズを実際には反映していないことがわかったcontentSizeので、一番下までスクロールしようとすると、少しずれます。実際のコンテンツ サイズを決定する最善の方法は、実際にはNSLayoutManager'susedRectForTextContainer:メソッドを使用することです。

UITextView *textView;
CGSize textSize = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size;

に実際に表示されるテキストの量を決定するにはUITextView、フレームの高さからテキスト コンテナのインセットを引いて計算します。

UITextView *textView;
UIEdgeInsets textInsets = textView.textContainerInset;
CGFloat textViewHeight = textView.frame.size.height - textInsets.top - textInsets.bottom;

次に、スクロールが簡単になります。

// if you want scroll animation, use contentOffset
UITextView *textView;
textView.contentOffset = CGPointMake(textView.contentOffset.x, textSize - textViewHeight);

// if you don't want scroll animation
CGRect scrollBounds = textView.bounds;
scrollBounds.origin = CGPointMake(textView.contentOffset.x, textSize - textViewHeight);
textView.bounds = scrollBounds;

異なるサイズが空のUITextView.

textView.frame.size = (width=246, height=50)
textSize = (width=10, height=16.701999999999998)
textView.contentSize = (width=246, height=33)
textView.textContainerInset = (top=8, left=0, bottom=8, right=0)
于 2015-06-26T22:00:14.097 に答える
0

下端までスクロールするには、ターゲット ビューの最大高さを操作する必要があります。

import UIKit

extension UIScrollView {

    func scrollToBottomOf(targetView: UIView, animated: Bool) {
        setContentOffset(CGPoint(x:targetView.frame.minX, y:targetView.frame.maxY), animated: animated)
    }
}

//func invocation example 
optionScrollView.scrollToBottomOf(targetView: self.optionsStackView, animated: false)
于 2021-11-09T04:52:49.293 に答える
-1

UICollectionViewコピーと貼り付けを容易にするための受け入れられた回答のXamarin.iOSバージョン

var bottomOffset = new CGPoint (0, CollectionView.ContentSize.Height - CollectionView.Frame.Size.Height + CollectionView.ContentInset.Bottom);          
CollectionView.SetContentOffset (bottomOffset, false);
于 2018-08-10T03:49:31.553 に答える