如何限制 UIScrollViewDelegate 仅适用于 UIViewController 中的一个视图

Posted

技术标签:

【中文标题】如何限制 UIScrollViewDelegate 仅适用于 UIViewController 中的一个视图【英文标题】:How to restrict UIScrollViewDelegate apply to only one view in UIViewController 【发布时间】:2018-02-25 03:13:53 【问题描述】:

我正在使用 Swift 开发 ios 应用程序。在应用程序中,我有一个 HomeViewController,它有两个视图 - UICollectionView 和 UITableView。

class HomeViewController: UIViewController, UITableViewDelegate,
      UITableViewDataSource, UICollectionViewDelegate 

     @IBOutlet weak var tableView: UITableView!
     @IBOutlet weak var carouselCollectionView: UICollectionView!


extension HomeViewController: UIScrollViewDelegate 
     func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint,
     targetContentOffset: UnsafeMutablePointer<CGPoint>) 

        let layout = self.carouselCollectionView?.collectionViewLayout as! UICollectionViewFlowLayout
        let cellWidthIncludingSpacing = layout.itemSize.width + layout.minimumLineSpacing
        var offset = targetContentOffset.pointee
        let index = (offset.x + scrollView.contentInset.left) / cellWidthIncludingSpacing
        let roundedIndex = round(index)
        offset = CGPoint(x: roundedIndex * cellWidthIncludingSpacing - scrollView.contentInset.left, y: -scrollView.contentInset.top)
        targetContentOffset.pointee = offset
     

HomeViewController 向 UIScrollViewDelegate 确认 - scrollViewWillEndDragging 因为我希望 collectionView 以某些特定行为滚动。 问题是当我滚动 tableView 时它会回到顶部。

我想要 tableView 的默认滚动行为。 如何强制仅 collectionView 使用 UIScrollViewDelegate?

【问题讨论】:

不能直接比较scrollView == self.carouselCollectionView吗? 【参考方案1】:

为 tableview 和 collectionview 创建额外的管理器类。这样您就可以将每个人的委托设置为他们自己的经理类。它将有助于使代码更清晰,更清楚地了解什么是控制什么,并将允许您将滚动视图逻辑放入其中一个管理器中,而不是让您的视图控制器使用所有的委托方法来膨胀。

【讨论】:

感谢您的回答。我对 Swift 很陌生,正在学习如何改进/拥有干净的代码。这是您正在谈论的方法吗 - 在 HomeViewController 上创建两个容器视图(每个视图一个),然后在各自的视图控制器中单独管理? 有许多不同的模式需要学习。我建议阅读一些有关 MVC 和 MVVM 的内容。但总的来说,对于这样的事情,具有符合 collectionviewdelegate 的单独类,并使该类的一个实例作为表视图的委托,而另一个类作为另一个类的委托,将使您清楚地知道什么代码为什么对象运行。 我为collectionview委托创建了一个自定义委托类,它也符合UIScrollViewDelegate - class CustomCollectionViewDelegate: NSObject, UICollectionViewDelegate, UIScrollViewDelegate ,并将该类的实例分配给控制器var customDelegate = CustomCollectionViewDelegate() carouselCollectionView.delegate = customDelegate中的Collection View。现在我的插座变量在 HomeViewController 中,我如何在委托方法中访问插座?我需要它来获取集合视图的布局以了解确切的滚动偏移量。

以上是关于如何限制 UIScrollViewDelegate 仅适用于 UIViewController 中的一个视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义 CollectionView 中使用 UIScrollViewDelegate?

如何同时滚动两个 UITableView?

UIScrollViewDelegate 没有触发

UIScrollViewDelegate 不触发方法

在 UICollectionView 子类中实现 UIScrollViewDelegate

成为 UITableView 的 UIScrollViewDelegate 代表