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 |
댓글