如何限制 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?