Swift 5:UICollectionView类中未调用scrollViewDidScroll

问题描述

是的,我已经检查了有关此主题的其他问题。由于某种原因,该功能

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    print(scrollView.contentOffset)
}

未在我的UICollectionView类中调用。

这是全班。当用户在每个单元格上滑动时,我基本上想更新pageControl。 我尝试了collectionView:willDisplayCell:forItemAtIndexPath:方法,但发现有时当我滚动并在单元格中途停止并返回时,它并没有更新为先前的值。因此,为什么我求助于scrollview委托。

class FilterInfoImagesCollectionViewController: UICollectionViewController {

    var selectedFilterCollection: FilterCollection!
    private let pageControl: UIPageControl = {
        let pageControl = UIPageControl()
        pageControl.currentPage = 0
        pageControl.numberOfPages = 5 // Hardcoded since we know there will only be 5 example images
        pageControl.translatesAutoresizingMaskIntoConstraints = false
        return pageControl
    }()
    private var datasource: DataSource!
    private var datas = [FilterInfo]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        collectionView.alwaysBounceVertical = false
        collectionView.isPagingEnabled = true
        collectionView.register(FilterInfoCollectionViewCell.self,forCellWithReuseIdentifier: FilterInfoCollectionViewCell.ReuseIdentifier)
        collectionView.collectionViewLayout = createLayout()
        collectionView.backgroundColor = .clear
        
        collectionView.delegate = self
        collectionView.dataSource = self

        configureDatasource()
        setupDatas()
        
        setupView()
        setupConstraint()
    }
    
    private func setupDatas() {
        let filterName = selectedFilterCollection.name.components(separatedBy: " ").first!
        for n in 1 ... 5 {
            let image = UIImage(named: "\(filterName).ex\(n)")
            
            let filterInfo = FilterInfo(image: image,filterName: "\(filterName)\(n)")
            datas.append(filterInfo)
        }
        
        self.createSnapshot(from: datas)
    }
    
    private func setupView() {
        self.view.addSubview(pageControl)
    }
    
    private func setupConstraint() {
        pageControl.snp.makeConstraints { (make) in
            make.centerX.equalToSuperview()
            make.bottom.equalToSuperview()
        }
    }
}

extension FilterInfoImagesCollectionViewController {
    fileprivate enum Section { case main }
    fileprivate typealias DataSource = UICollectionViewDiffableDataSource<Section,FilterInfo>
    fileprivate typealias Snapshot = NSDiffableDataSourceSnapshot<Section,FilterInfo>
    
    
    fileprivate func configureDatasource() {
        datasource = DataSource(collectionView: collectionView!,cellProvider: { (collectionView,indexPath,filterInfo) -> UICollectionViewCell? in
            guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FilterInfoCollectionViewCell.ReuseIdentifier,for: indexPath) as? FilterInfoCollectionViewCell else { return nil }
            
            cell.filterInfo = filterInfo
            
            return cell
        })
    }
    
    fileprivate func createSnapshot(from datas: [FilterInfo]) {
        var snapshot = Snapshot()
        snapshot.appendSections([.main])
        snapshot.appendItems(datas)
        datasource.apply(snapshot,animatingDifferences: true)
    }
    
    private func createLayout() -> UICollectionViewLayout {
        
        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),heightDimension: .fractionalHeight(1))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)
        
        let groupSize = NSCollectionLayoutSize(
            widthDimension: .fractionalWidth(1),heightDimension: .fractionalHeight(1))
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize,subitem: item,count: 1)
        
        let section = NSCollectionLayoutSection(group: group)
        section.orthogonalScrollingBehavior = .groupPaging
        
        let layout = UICollectionViewCompositionalLayout(section: section)
        return layout
    }
}

extension FilterInfoImagesCollectionViewController {
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print(scrollView.contentOffset)
    }
}

为什么不叫它?我尝试与其他scrollview委托方法进行检查,并且发生相同的事情-未调用。

更新:根据请求将委托和数据源添加到自身

解决方法

添加viewDidLoad。与UICollectionViewDelegate相关的滚动功能,您需要设置代理以使用覆盖功能

section.visibleItemsInvalidationHandler = { [weak self] visibleItems,point,environment in
    self?.pager.currentPage = visibleItems.last!.indexPath.row
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...