【问题标题】:scrollViewDidScroll: when scroll programmatically?scrollViewDidScroll:以编程方式滚动时?
【发布时间】: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 但似乎他的解决方案(第一个)没有动画,而我需要那个动画。

【问题讨论】:

    标签: ios objective-c


    【解决方案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。
    • 它确实做到了!拖动方法(您的第一个答案)也对我有用。奇怪。
    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 2011-01-16
    • 2011-01-15
    • 2010-11-13
    • 2014-05-22
    • 2013-07-09
    相关资源
    最近更新 更多