UICollectionView
私は正常に動作し、スクロールする水平を持っています。アイテムをタップすると、データが更新され、 が呼び出されますreloadData
。これは機能し、新しいデータが に表示されますUICollectionView
。問題は、スクロール位置が変わらず、最後の場所を表示していることです。スクロールを一番上にリセットしたい(または私の場合は左に)。これどうやってするの?
9 に答える
あなたがしたいsetContentOffset:
。CGPointMake を使用して任意に設定できる引数として CGPoint を取りますが、コレクションの最初に戻りたい場合は、単に CGPointZero を使用できます。
[collectionView setContentOffset:CGPointZero animated:YES];
このメソッドを使用して、必要な項目までスクロールできます。
- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath
atScrollPosition:(UICollectionViewScrollPosition)scrollPosition
animated:(BOOL)animated
私はこれをアプリのさまざまな部分で頻繁に使用するため、UIScrollView を拡張して、任意のスクロール ビューおよびスクロール ビュー サブクラスで使用できるようにしました。
extension UIScrollView {
/// Sets content offset to the top.
func resetScrollPositionToTop() {
self.contentOffset = CGPoint(x: -contentInset.left, y: -contentInset.top)
}
}
したがって、位置をリセットする必要があるときはいつでも:
self.collectionView.resetScrollPositionToTop()
スウィフトの場合:
collectionView.setContentOffset(CGPointZero, animated: true)
コレクション ビューを格納するビューを離れる場合は、2 番目のビュー コントローラーで変更を行い、戻ったときにコレクション ビューを更新する必要があります。
@IBAction func unwindTo_CollectionViewVC(segue: UIStoryboardSegue) {
//Automatic table reload upon unwind
viewDidLoad()
collectionView.reloadData()
collectionView.setContentOffset(CGPointZero, animated: true)
}
私の状況では、viewDidLoad 呼び出しが CoreData コンテキストを更新し、reloadData 呼び出しが collectionView を更新して新しい CoreData コンテキストを反映するようにし、contentOffset がテーブルをトップに戻すようにするため、アンワインドは素晴らしいです。
私の場合、CGPointZero はコレクション ビューのコンテンツをシフトしました。これは、コンテンツ インセットをカウントしていないためです。これは私のために働いたものです:
CGPoint topOffest = CGPointMake(0,-self.collectionView.contentInset.top);
[self.collectionView setContentOffset:topOffest animated:YES];
申し訳ありませんが、この記事の執筆時点ではコメントできませんでしたが、UINavigationController を使用していて、CGPointZero
それ自体ではトップに到達できなかったため、代わりに次を使用する必要がありました。
CGFloat compensateHeight = -(self.navigationController.navigationBar.bounds.size.height+[UIApplication sharedApplication].statusBarFrame.size.height);
[self.collectionView setContentOffset:CGPointMake(0, compensateHeight) animated:YES];
これが将来誰かに役立つことを願っています。乾杯!
UINavigationController
および透明なナビゲーション バーを処理するには、最初の要素の位置に完全に一致するように追加の上部オフセットを計算する必要がありました。
スウィフト 1.1 コード:
let topOffest = CGPointMake(0, -(self.collectionView?.contentInset.top ?? O))
self.collectionView?.setContentOffset(topOffest, animated: true)
乾杯!