scrollViewDidScroll:以编程方式滚动时?

Posted

技术标签:

【中文标题】scrollViewDidScroll:以编程方式滚动时?【英文标题】:scrollViewDidScroll: when scroll programmatically? 【发布时间】:2014-05-23 13:01:31 【问题描述】:

我有这个委托,它打算在用户用手指滚动时执行:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView

我有这行代码滚动到开头:

[scroller scrollRectToVisible:CGRectMake(0, 0,scroller.frame.size.width,scroller.frame.size.height) animated:YES];

当我执行这行代码以编程方式滚动时,第一个委托也被调用。 我想避免这种情况发生。

我试图将委托设置为 nil,但它仍然执行委托:

scroller.delegate=nil;//to not excute scrolldidscroll
[scroller scrollRectToVisible:CGRectMake(0, 0,scroller.frame.size.width,scroller.frame.size.height) animated:YES];
scroller.delegate=self;

编辑:

我已经阅读了这个很好的答案:Setting contentOffset programmatically triggers scrollViewDidScroll 但似乎他的解决方案(第一个)没有动画,而我需要那个动画。

【问题讨论】:

【参考方案1】:

可能有更好的解决方案,但这应该可行:

在你的 .h 中声明一个布尔值

@property(nonatomic,assign) BOOL scrollingProgrammatically;

在你的 .m 中:

self.scrollingProgrammatically = YES;
[scroller scrollRectToVisible:CGRectMake(0, 0,scroller.frame.size.width,scroller.frame.size.height) animated:YES];

...

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
    if(!self.scrollingProgrammatically)
        ...
    


-(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
    self.scrollingProgrammatically = NO;

【讨论】:

好的,我会去的.. :) 嗯,是的,可能没有更轻松的方法可以做到这一点。我也编辑了我的答案,因为如果以编程方式调用滚动,则不会调用 didEndDragging。 它确实做到了!拖动方法(您的第一个答案)也对我有用。奇怪。

以上是关于scrollViewDidScroll:以编程方式滚动时?的主要内容,如果未能解决你的问题,请参考以下文章

我能以某种方式从 UIPageViewController 获取 scrollViewDidScroll: UIScrollView Delegate 方法吗?

scrollViewDidScroll scrollViewWillEndDragging 在主线程上同时运行?

我的应用调用 scrollViewDidScroll 19 次

用奇怪的 contentOffsetY 调用 scrollViewDidScroll

视差 UIScrollView – 在一个 scrollViewDidScroll 方法中处理两个视图?

使用 swift 将 y contentOffset 从 scrollViewDidScroll(scrollView 传递到另一个视图控制器