Paging UICollectionView by cells, not screen

前端 未结 22 2055
予麋鹿
予麋鹿 2020-12-04 05:00

I have UICollectionView with horizontal scrolling and there are always 2 cells side-by-side per the entire screen. I need the scrolling to stop at the begining

22条回答
  •  自闭症患者
    2020-12-04 05:37

    Also you can create fake scroll view to handle scrolling.

    Horizontal or Vertical

    // === Defaults ===
    let bannerSize = CGSize(width: 280, height: 170)
    let pageWidth: CGFloat = 290 // ^ + paging
    let insetLeft: CGFloat = 20
    let insetRight: CGFloat = 20
    // ================
    
    var pageScrollView: UIScrollView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Create fake scrollview to properly handle paging
        pageScrollView = UIScrollView(frame: CGRect(origin: .zero, size: CGSize(width: pageWidth, height: 100)))
        pageScrollView.isPagingEnabled = true
        pageScrollView.alwaysBounceHorizontal = true
        pageScrollView.showsVerticalScrollIndicator = false
        pageScrollView.showsHorizontalScrollIndicator = false
        pageScrollView.delegate = self
        pageScrollView.isHidden = true
        view.insertSubview(pageScrollView, belowSubview: collectionView)
    
        // Set desired gesture recognizers to the collection view
        for gr in pageScrollView.gestureRecognizers! {
            collectionView.addGestureRecognizer(gr)
        }
    }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView == pageScrollView {
            // Return scrolling back to the collection view
            collectionView.contentOffset.x = pageScrollView.contentOffset.x
        }
    }
    
    func refreshData() {
        ...
    
        refreshScroll()
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        refreshScroll()
    }
    
    /// Refresh fake scrolling view content size if content changes
    func refreshScroll() {
        let w = collectionView.width - bannerSize.width - insetLeft - insetRight
        pageScrollView.contentSize = CGSize(width: pageWidth * CGFloat(banners.count) - w, height: 100)
    }
    

提交回复
热议问题