UICollectionView
を使用して、サムネイルのセットをすばやくスクロールします。スクロールが終了したら、現在のサムネイルの大きな高解像度バージョンを表示したいと思います。
ユーザーがスクロールを完了したことを検出するにはどうすればよいですか?私はdidEndDisplayingCell
を実装していますが、それは特定のセルがスクロールオフしたときだけを教えてくれます。スクロールモーションが実際にいつ完了するかはわかりません。
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView
UICollectionView
はUIScrollView
のサブクラスです。したがって、デリゲートを設定してUIScrollViewDelegate
を実装している場合、UIScrollView
と同じ方法でこれを検出できるはずです。
例えば:-
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
ドキュメント に従って、上記のメソッドは、スクロールビューがスクロール動作の減速を終了したことを通知する必要があります。
ベースをカバーするために、これら両方のUIScrollViewDelegateメソッドを実装する必要があります。場合によっては、減速が発生しない可能性があります(scrollViewDidEndDecelerating
は呼び出されません)。たとえば、ページが完全にスクロールされます。その場合は、scrollViewDidEndDragging
で更新を行ってください。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (!decelerate) {
[self updateStuff];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self updateStuff];
}
ここで注意すべき重要な事実:
このメソッドは、ユーザーが開始したスクロール(つまり、パンジェスチャー)で呼び出されます
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
一方、これは手動で(プログラムで)開始されたすべてのスクロール(scrollRectToVisible
やscrollToItemAtIndexPath
など)で呼び出されます
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
Swift 3バージョン:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// Your code here
}
Abey MとD6miの回答のSwift 3バージョン:
スクロールがユーザーのアクションによって引き起こされた場合
public func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if (!decelerate) {
//cause by user
print("SCROLL scrollViewDidEndDragging")
}
}
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
//caused by user
print("SCROLL scrollViewDidEndDecelerating")
}
スクロールがコードアクションによって引き起こされる場合(プログラムで):(「scrollRectToVisible」や「scrollToItemAtIndexPath」など)
public func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
//caused by code
print("SCROLL scrollViewDidEndScrollingAnimation")
}
ノート:
。
open class MyClass: NSObject , UICollectionViewDelegate
そしてあなたのviewWillAppearのどこかでクラスを独自のデリゲートにします
override open func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// ...
self.myScrollView.delegate = self
// ...
}
表示可能なインデックスパスを使用する場合:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self scrollingFinish];
}
- (void)scrollingFinish {
if([self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader]){
NSIndexPath *firstVisibleIndexPath = [[self.collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader] firstObject];
[self.collectionView scrollToItemAtIndexPath:firstVisibleIndexPath atScrollPosition:UICollectionViewScrollPositionTop animated:YES];
[NSObject cancelPreviousPerformRequestsWithTarget:self];
}
}