如何覆盖ScrollViewDidEndDecelerating并找到当前可见的单元格?

时间:2018-05-25 00:29:21

标签: ios swift uiscrollview uicollectionview

我有一个包含collectionView的视图控制器:

class TagViewController: UIViewController,  UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var collectionView: UICollectionView!


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return posts.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let post = posts[indexPath.row]
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! SNPostViewCell
        cell.isVideo = post.isVideo
        cell.mediaURL = URL(string: post.mediaURL)
        cell.backgroundColor = UIColor.black
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let post = posts[indexPath.row]
        if post.isVideo == true {
            self.performSegue(withIdentifier: "playVideo", sender: nil)
        } else {
            print("is image. might go full screen one day here")
        }
        let bin = self.bins[post.timeStamp]
        print(bin)
    }
    override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {                //Error: method cannot override from its superclass
        <#code#>
    }

}

虽然我可以覆盖那些collectionView函数,但似乎要覆盖scrollViewDidEndDecelerating我特别需要有一个collectionView实例(而不是在视图控制器中执行)

好的,所以我做了一个自定义的collectionView,它继承自collectionViewController。这会正确覆盖scrollViewDidEndDecelerating(该方法现在从其超类中覆盖),并且我在其中使用代码来查找当前单元格的索引,

class PagingCollectionViewController: UICollectionViewController {
...   
 override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        if (self.collectionView.contentOffset.y < 0) {
            self.collectionView.contentOffset = CGPointMake(self.collectionView.contentOffset.x, 0.0);
        }
        for cell in yourCollectionViewname.visibleCells()  as [UICollectionViewCell]    {
            let indexPath = yourCollectionViewname.indexPathForCell(cell as UICollectionViewCell)

        }
    }

...
}

但是,你可以看到这需要引用我不会在类中定义的collectionView的当前索引吗?仅在创建和填充实例的控制器视图中...

所以我真的不知道在哪里放置这个覆盖scrollViewDidEndDecelerating函数以及如何成功访问其中的数据 - 找到索引。

1 个答案:

答案 0 :(得分:4)

这是错误的:

override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    <#code#>
}

...因为scrollViewDidEndDecelerating 不是 override方法。它是委托方法。

https://developer.apple.com/documentation/uikit/uiscrollviewdelegate/1619417-scrollviewdidenddecelerating

因此,请删除override一词,并将self设为delegate的{​​{1}},然后您就完成了设置。