我在我的应用程序中使用scrollViewDidScroll委托。
但是,很多时候,即使我没有开始滚动,这个委托也会被调用,这会产生很多问题。我听说即使设置了特定滚动视图的 contentSize,此时也会调用该委托,即
scrollViewDidScroll
。
调用该委托的不同场景有哪些?控制这个的步骤是什么?
我可以设置任何参数来处理这个问题吗?
为了防止
scrollDidScroll:
在加载和调整视图时自动触发,我等待添加我的 UIScrollView
delegate
,直到使用 viewDidLayoutSubviews
加载所有视图之后。它对我来说效果很好。
- (void)viewDidLayoutSubviews {
// add table view delegate after the views have been laid out to prevent scrollViewDidScroll
// from firing automaticly when the view is adjusted on load, which makes the tab bar disappear
self.tableView.delegate = self;
}
scrollViewDidScroll:每次滚动边界发生变化时都会被调用。 这意味着它会在滚动期间以及滚动时被调用 开始。您可能想尝试使用scrollViewWillBeginDragging: 代替。
如果您想知道
scrollDidScroll
是手动触发的(通过手指手势)还是由于其他事件(如 didSelect
或 setContentOffset
)触发,请使用 UIScrollView.isTracking
和 UIScrollView.isDecelerating
属性。
使用示例:
if scrollView.isTracking || scrollView.isDecelerating {
scrollPosition = collectionView.contentOffset
}
在此方法中设置UICollectionView、UITableView委托
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// This method is called only after all subviews are laid
}
此外,如果您只需要为“用户拖动滚动”调用它,您可以使用此:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
guard scrollView.isDragging else {
return // Ignore programmatic scroll or layout updates
}
// Handle user-driven scrolling here
}