본문 바로가기
iOS/iOS

UICollectionView 페이징

by 패쓰킴 2022. 9. 30.
728x90

컬렉션뷰를 이용해서 컨텐츠를 보여줄 때 

컬렉션뷰를 스크롤 할 때

하나씩(원하는 만큼) 넘어가도록 만들고 싶을 때 ,

 

scrollViewWillEndDragging 함수를 이용하여 처리 할 수 있다.

@interface ViewController () <UIScrollViewDelegate, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> {
    NSInteger currentItemIndex;
}
@end
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    //좌우 목록 콜랙션 뷰일 때만
    if (scrollView == self.컬렉션뷰) {
        UICollectionViewFlowLayout * flowLayout = (UICollectionViewFlowLayout*)self.컬렉션뷰.collectionViewLayout;
        // 기본적으로 10이 세팅되어 있으므로 0으로 설정
        [flowLayout setMinimumLineSpacing:0.0f];
        float cellWidth = self.view.frame.size.width; // 원하는 셀의 사이즈!
        float index = targetContentOffset->x / cellWidth;
        float roundedIndex = round(index);
        
        if(scrollView.contentOffset.x > targetContentOffset->x) { // 왼쪽에서 오른쪽으로 스크롤
            roundedIndex = floor(index); //소수점 버림
        } else if (scrollView.contentOffset.x < targetContentOffset->x) { // 오른쪽에서 왼쪽으로 스크롤
            roundedIndex = ceil(index);
        } else {
            roundedIndex = round(index);
        }
        
        if (currentItemIndex > roundedIndex) { // 왼쪽에서 오른쪽으로 스크롤
            currentItemIndex -= 1;
            roundedIndex = currentItemIndex;
        } else if (currentItemIndex < roundedIndex) { // 오른쪽에서 왼쪽으로 스크롤
            if (roundedIndex == 1) {
                if (scrollView.contentOffset.x < 0 && targetContentOffset->x < 3) {
                    currentItemIndex = 0;
                    roundedIndex = currentItemIndex;
                } else{
                    currentItemIndex += 1;
                    roundedIndex = currentItemIndex;
                }
            } else{
                currentItemIndex += 1;
                roundedIndex = currentItemIndex;
            }
            
            
        }
        // 위 코드를 통해 페이징 될 좌표값을 targetContentOffset에 대입하면 된다.
        *targetContentOffset = CGPointMake(roundedIndex * cellWidth, 0);
    }
}
728x90

'iOS > iOS' 카테고리의 다른 글

Animation  (0) 2022.10.11
지도앱 URL Scheme  (0) 2022.10.05
햅틱 & 진동  (0) 2022.09.06
화면 캡처 방지  (0) 2022.08.19
stored property에 'available' 사용하기  (0) 2022.08.16

댓글