2017-04-14 1 views

답변

0

컬렉션보기에 pagingEnabled을 설정했다고 가정합니다. 이 속성은 UIScrollView에서 상속됩니다 (UICollectionViewUIScrollView의 하위 클래스이므로).

문제는 컬렉션보기가 자체 너비 (게시물에서 320 포인트)를 페이지 너비로 사용한다는 것입니다. 각 셀은 콜렉션 뷰와 같은 너비이지만 셀 사이에 10 포인트의 "거터"가 있습니다. 즉 셀 0의 왼쪽 가장자리에서 셀 1의 왼쪽 가장자리까지의 거리는 320 + 10 = 330 포인트입니다. 따라서 셀 1을 표시하기 위해 스크롤하면 콜렉션 뷰는 오프셋 320 (자체 너비)에서 스크롤을 중지하지만 셀 1은 실제로 오프셋 330에서 시작합니다.

가장 쉬운 방법은 pagingEnabled을 끄고 다음과 같이 직접 페이징을 구현하는 것입니다. 이 같은 컬렉션 뷰 위임에 scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)를 오버라이드 (override) :

override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else { return } 

    let pageWidth = scrollView.bounds.size.width + flowLayout.minimumInteritemSpacing 

    let currentPageNumber = round(scrollView.contentOffset.x/pageWidth) 
    let maxPageNumber = CGFloat(collectionView?.numberOfItems(inSection: 0) ?? 0) 

    // Don't turn more than one more page when decelerating, and don't go beyond the first or last page. 
    var pageNumber = round(targetContentOffset.pointee.x/pageWidth) 
    pageNumber = max(0, currentPageNumber - 1, pageNumber) 
    pageNumber = min(maxPageNumber, currentPageNumber + 1, pageNumber) 
    targetContentOffset.pointee.x = pageNumber * pageWidth 
} 

당신은 또한 빨리 장치 화면 크기에 맞게 항목의 크기를 설정하고 감속 속도를 설정할 수 있습니다 :

아르 자형 esult는 :

demo

+0

솔루션 및 훌륭한 설명에 감사드립니다. @robmayoff, 원활하게 작동합니다. –

0

이유는 셀 (320)의 폭을 설정하는 동안 당신이 minimum separation of 10을 촬영하지 않은 것입니다 (더 나은 이해를 위해 스크린 샷을 확인). 따라서이 10은 누적 될 때마다 누적됩니다.

너비를 설정하는 동안 320에서 10을 빼야하므로 너비는 310 IMO가되어야합니다.

+0

내 계산을 정확하지 않을 수 있습니다,하지만 당신은 고려 사항으로 그을해야하므로 최소 간격 축적는 이유입니다. –

관련 문제