web-dev-qa-db-ja.com

画面がロードされると、UICollectionViewが自動的に下にスクロールします

画面が最初にロードされたときに、UICollectionViewの一番下までスクロールする方法を見つけようとしています。ステータスバーに触れたときに一番下までスクロールできますが、ビューが読み込まれたときにも自動的にスクロールできるようにしたいと思います。ステータスバーがタッチされたときに下にスクロールしたい場合、以下は正常に機能します。

- (BOOL)scrollViewShouldScrollToTop:(UITableView *)tableView
{
NSLog(@"Detect status bar is touched.");
[self scrollToBottom];
return NO;
}

-(void)scrollToBottom
{//Scrolls to bottom of scroller
 CGPoint bottomOffset = CGPointMake(0, collectionViewReload.contentSize.height -     collectionViewReload.bounds.size.height);
 [collectionViewReload setContentOffset:bottomOffset animated:NO];
 }

ViewDidLoadで[self scrollToBottom]を呼び出してみました。これは機能しません。ビューが読み込まれたときに下にスクロールする方法についてのアイデアはありますか?

27
SNV7

私のコメントについて詳しく説明します。

viewDidLoadは、要素が視覚化される前に呼び出されるため、特定のUI要素を適切に操作できません。作業中にボタンを移動するようなものですが、サブビューを扱うことはよくありません(CollectionViewのスクロールなど)。

これらのアクションのほとんどは、viewWillAppearまたはviewDidAppearで呼び出されたときに最適に機能します。 Appleこれらのメソッドのいずれかをオーバーライドする際に行うべき重要なことを指摘しているドキュメントからの例外です:

このメソッドをオーバーライドして、ビューの表示に関連する追加のタスクを実行できます。 このメソッドをオーバーライドする場合、実装のある時点でsuperを呼び出す必要があります。

スーパーコールは通常、カスタム実装の前に呼び出されます。 (したがって、オーバーライドされたメソッド内のコードの最初の行)。

17
Firo

ViewWillAppearでは何も機能しないことがわかりました。私はそれをviewDidLayoutSubviewsでのみ動作させることができます:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:endOfModel inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
}
34
Will Larche

同様の問題が発生したため、ここに別の方法がありますscrollToItemAtIndexPathを使用せずに

これは、コンテンツがビューフレームよりも大きい場合にのみ下にスクロールします。

おそらくscrollToItemAtIndexPathを使用する方が適切ですが、これは別の方法です。

CGFloat collectionViewContentHeight = myCollectionView.contentSize.height;
CGFloat collectionViewFrameHeightAfterInserts = myCollectionView.frame.size.height - (myCollectionView.contentInset.top + myCollectionView.contentInset.bottom);

if(collectionViewContentHeight > collectionViewFrameHeightAfterInserts) {
   [myCollectionView setContentOffset:CGPointMake(0, myCollectionView.contentSize.height - myCollectionView.frame.size.height) animated:NO];
}
9
Fazri

Swift 3の例

let sectionNumber = 0
self.collectionView?.scrollToItem(at: //scroll collection view to indexpath
                                  NSIndexPath.init(row:(self.collectionView?.numberOfItems(inSection: sectionNumber))!-1, //get last item of self collectionview (number of items -1)
                                                   section: sectionNumber) as IndexPath //scroll to bottom of current section
                                , at: UICollectionViewScrollPosition.bottom, //right, left, top, bottom, centeredHorizontally, centeredVertically
                                animated: true)
6
mourodrigo

私にとって、私は次の解決策を見つけました:

collectionViewでreloadDataを呼び出し、メインでdcgをスクロールさせます。

 __weak typeof(self) wSelf = self;

 [wSelf.cv reloadData];
 dispatch_async(dispatch_get_main_queue(), ^{
 NSLog(@"HeightGCD:%@", @(wSelf.cv.contentSize.height));
 [wSelf.cv scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:50 inSection:0] atScrollPosition:UICollectionViewScrollPositionBottom animated:YES];
 });
3
Dmitry Nelepov

最後のアイテムのインデックスパスを取得します。その後...

- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated
3
user1951992