Swift 5:UICollectionView类中未调用scrollViewDidScroll

Swift 5:UICollectionView类中未调用scrollViewDidScroll,swift,uicollectionview,uiscrollview,uikit,uiscrollviewdelegate,Swift,Uicollectionview,Uiscrollview,Uikit,Uiscrollviewdelegate,是的,我查过关于这个话题的其他问题。出于某种原因,函数 override func scrollViewDidScroll(_ scrollView: UIScrollView) { print(scrollView.contentOffset) } 在我的UICollectionView类中未调用 这是全班同学。我基本上想在用户在每个单元格上滑动时更新我的pageControl。 我尝试了collectionView:willDisplayCell:forItemAtIndexPat

是的,我查过关于这个话题的其他问题。出于某种原因,函数

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)
    }
}
class FilterInfo图像集合视图控制器:UICollectionViewController{
var selectedFilterCollection:FilterCollection!
私有let pageControl:UIPageControl={
让pageControl=UIPageControl()
pageControl.currentPage=0
pageControl.numberOfPages=5//硬编码,因为我们知道只有5个示例图像
pageControl.TranslatesAutoResizezingMaskintoConstraints=false
返回页控件
}()
私有变量数据源:数据源!
私有变量数据=[FilterInfo]()
重写func viewDidLoad(){
super.viewDidLoad()
collectionView.alwaysBounceVertical=false
collectionView.isPaginEnabled=true
collectionView.register(FilterInFoccollectionViewCell.self,forCellWithReuseIdentifier:FilterInFoccollectionViewCell.ReuseIdentifier)
collectionView.collectionViewLayout=createLayout()
collectionView.backgroundColor=.clear
collectionView.delegate=self
collectionView.dataSource=self
configureDatasource()
setupDatas()
setupView()
setupConstraint()
}
专用函数设置数据(){
让filterName=selectedFilterCollection.name.components(分隔符:“”)。首先!
对于1…5中的n{
让image=UIImage(名为:“\(filterName.ex\(n)”)
让filterInfo=filterInfo(图像:图像,过滤器名称:“\(过滤器名称)\(n)”)
data.append(filterInfo)
}
self.createSnapshot(来自:数据)
}
私有函数设置视图(){
self.view.addSubview(页面控件)
}
专用函数setupConstraint(){
pageControl.snp.makeConstraints{(make)在
make.centerX.equalToSuperview()
make.bottom.equalToSuperview()
}
}
}
扩展筛选器图像集合视图控制器{
fileprivate枚举节{case main}
fileprivate typealias DataSource=UICollectionViewDiffableDataSource
fileprivate typealias Snapshot=NSDiffableDataSourceSnapshot
fileprivate func configureDatasource(){
datasource=datasource(collectionView:collectionView!,cellProvider:{(collectionView,indexPath,filterInfo)->UICollectionViewCell?在
guard let cell=collectionView.dequeueReusableCell(带ReuseIdentifier:FilterInFocCollectionViewCell.ReuseIdentifier,for:indexPath)作为?FilterInFocCollectionViewCell else{return nil}
cell.filterInfo=filterInfo
返回单元
})
}
fileprivate func createSnapshot(来自数据:[FilterInfo]){
var snapshot=snapshot()
snapshot.appendSections([.main])
snapshot.appendItems(数据)
datasource.apply(快照、动画差异:true)
}
私有函数createLayout()->UICollectionViewLayout{
让itemSize=NSCollectionLayoutSize(宽度维度:。分数宽度(1),高度维度:。分数高度(1))
let item=NSCollectionLayoutItem(layoutSize:itemSize)
让groupSize=NSCollectionLayoutSize(
宽度尺寸:。分数宽度(1),
高度尺寸:。分馏高度(1))
let group=NSCollectionLayoutGroup.horizontal(layoutSize:groupSize,子项:项,计数:1)
let section=NSCollectionLayoutSection(组:组)
section.orthogonalScrollingBehavior=.groupPaging
let layout=UICollectionViewCompositionLayout(截面:截面)
返回布局
}
}
扩展筛选器图像集合视图控制器{
重写func scrollViewDidScroll(scrollView:UIScrollView){
打印(scrollView.contentOffset)
}
}
为什么不叫它?我试着检查其他scrollview委托方法,同样的情况也发生了——没有调用


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

添加到viewDidLoad中。与UICollectionViewDelegate相关的滚动功能,您需要设置用于使用覆盖功能的委托

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

您还没有在代码中设置collectionView.delegate=self,只是添加了它,仍然没有调用。您可以用delegate pls更新您的代码,并将其显示给您吗?另外,让我们回答以下问题:它按照您的预期工作,但只有此函数没有启动?使用委托和数据源更新了代码。仍然不起作用):@AlexanderNikolaychuk是的,一切都按预期进行。让我困惑的是,为什么没有调用scrollview委托——也就是说,没有添加print方法(也更新了我的代码以反映这一点),而且scrollViewDidScroll仍然没有调用。(方法内的打印未被激发)看起来您需要这个