scrollViewDidScroll:以编程方式滚动?

时间:2014-05-23 13:01:32

标签: ios objective-c

我有这个代表,当用户用手指滚动时,它将被执行:

-(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 个答案:

答案 0 :(得分:7)

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

在.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;
}