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
'development' 카테고리의 다른 글
50 % 불투명도 배경 위에 100 % 불투명도 UILabel (UIView?) (0) | 2020.12.31 |
---|---|
Django BooleanField를 라디오 버튼으로 사용합니까? (0) | 2020.12.31 |
목록에서 중복을 제거하는 방법은 무엇입니까? (0) | 2020.12.31 |
UIPageViewController에서 점 숨기기 (0) | 2020.12.31 |
특정 순서로 PHPUnit 테스트 실행 (0) | 2020.12.31 |