development

UICollectionView : 스크롤이 중지되었을 때 감지하는 방법

big-blog 2020. 12. 31. 23:23
반응형

UICollectionView : 스크롤이 중지되었을 때 감지하는 방법


를 사용하여 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")
}

메모:

  • 이러한 함수를 UIScrollViewDelegate 또는 UICollectionViewDelegate 대리자에 넣으십시오.
  • if you don't have a separate delegate, make your current class extend a UIScrollViewDelegate op top of your class file

.

open class MyClass: NSObject , UICollectionViewDelegate

and somewhere in your viewWillAppear make the class its own delegate

override open func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // ...
    self.myScrollView.delegate = self
    // ...
}

if you want to use the visible indexpath:

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

ReferenceURL : https://stackoverflow.com/questions/14868269/uicollectionview-how-to-detect-when-scrolling-has-stopped

반응형