롱타임 노씨 여러분
오늘은 페이징에 대해서 간단하게 알아보계씀니다
collectionview 를 사용해서 스크롤을 하게 되면 따로 페이징이 안걸리고 쭉쭉 밀려나가잖아요?
하지만 기획에서는 그런것을 원하지 않는 경우가 태반입니다
그러면 페이징을 걸어줘야 하는데, 사실 이건 되게 간단하죠.
collectionView.isPagingEnabled = true
한줄이면 되긴 합니다 ;
그럼 오늘은 여기까지 하고 가볼게여 안녕~
.
.
.
.
죄송합니다..
뭐 셀의 넓이가 뷰의 넓이와 동일하면 저 코드로 충분하지만,
디자인에서 요청하는 그림은 사실 그런것보단 다음 페이지의 셀의 옆부분이 살짝 보이는 경우가 굉장히 많죠?
그렇다면 이런 효과를 구현하는 것이 이 포스팅의 목적입니다.
사실 아주 간단합니다.
UIScrollviewDelegate 에서 확인할 수 있는 scrollViewWillEndDragging 을 사용하면 되는데요,
Dragging 이 끝나기 직전에 호출되는 함수입니다. 여기서 targetContentOffset 을 조정해주면 페이징을 구현할 수 있습니다.
바로 코드로 보시져
var currentIdx: CGFloat = 0.0
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
if let cv = scrollView as? UICollectionView {
let layout = cv.collectionViewLayout as! UICollectionViewFlowLayout
let cellWidth = layout.itemSize.width + layout.minimumLineSpacing
var offset = targetContentOffset.pointee
let idx = round((offset.x + cv.contentInset.left) / cellWidth)
if idx > currentIdx {
currentIdx += 1
} else if idx < currentIdx {
if currentIdx != 0 {
currentIdx -= 1
}
}
offset = CGPoint(x: currentIdx * cellWidth - cv.contentInset.left, y: 0)
targetContentOffset.pointee = offset
}
}
먼저 currentIdx 는 보여줄 페이지입니다 저희는 언제나 0부터 시작을 하져
cellWidth 를 계산을 해줍니다. layout 에서 itemSize 를 지정해주지 않을 시에는 기본값으로 들어가니까 이부분은 각자의 코드에 맞게 조정을 해주시구여
현재 targetOffset 과 계산한 cellWidth 를 이용해서, 이동한 인덱스를 계산해줍시당
round 는 다 아시다시피 반올림 하는 함수기 때문에 스크롤이 페이지의 중간을 넘어가지 않으면 페이징이 되지 않아여
아래 분기문은 한페이지씩 넘기기 위한 코드인데, 그게 싫으시면 사용 안하시면 됩니다 ㅎㅎ
어렵지 않져?
자 이제 아주 멋지게 페이징을 구현했습니다
기획자 디자이너분들에게 당당히 자랑하시면 되게씁니다
그럼 이만 줄여볼게용
다음에 또 만나여 안녕~~~~~
'Swift 개발 이야기' 카테고리의 다른 글
Group UITableView Footer 공백 없애는 방법 (0) | 2020.10.06 |
---|---|
Content Hugging & Compression Resistance Priority in Swift (0) | 2020.09.22 |
Dispatch Queue in Swift (0) | 2020.08.20 |
XIB 를 이용해서 Custom View 만들기 (0) | 2020.08.04 |
iOS Custom Font 사용하기 (0) | 2020.07.08 |