将scrollViewDidScroll与多个UIScrollViews一起使用

时间:2009-09-27 05:49:29

标签: cocoa cocoa-touch xcode uiscrollview

我有两个水平滚动的UIScrollViews在一个ViewController中垂直堆叠在一起。每个UIScrollView占用屏幕的一半。我试图独立跟踪两个UIScrollViews的位置。

我已成功使用它来跟踪顶部UIScrollView的位置:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView1 {

int Position = (scrollView1.contentOffset.x);

    if (Position == 0) {
    NSLog(@"Play A"); 
    }

    else if (Position == 280) {
    NSLog(@"Play B"); 
    }

//etc.
}

我想跟踪底部UIScrollView的位置。

当我尝试使用它时:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView2 {

int Position2 = (scrollView2.contentOffset.x);

if (Position2 == 0) {
NSLog(@"Play A2"); 
}

else if (Position == 280) {
NSLog(@"Play B2"); 
}

//etc.
}

我收到一条错误,上面写着“重新定义FirstViewConroller scrollViewDidScroll”。

所以,决定按下,我尝试了一个相当hackish的解决方案并尝试使用它:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView2

{

int Position2 = (scrollView2.contentOffset.x);

if (Position2 == 0) {
NSLog(@"Play A2"); 
}

else if (Position2 == 280) {
NSLog(@"Play B2"); 
}

//etc.
}

这个问题是当我移动任何一个UIScrollViews时它会触发两个方法。例如 - 如果我将底部UIScrollView 280像素(一个图像)向右移动,我在控制台中获得的输出是:

更多播放
PlayB2

如果我向右移动顶部UIScrollView三个图像,我得到的输出是:

PlayC
PlayC2

这对我没有任何意义。

我想我可能会反对我对代表工作方式的不完全理解。在viewDidLoad方法中,我设置了两个:

scrollView1.delegate = self;
scrollView2.delegate = self;

也许这是问题的一部分?也许我通过声明两个scrollViews具有相同的委托来引起麻烦?只是不确定。

我也尝试将所有条件语句组合到一个方法中 - 但我只想跟踪底部UIScrollView移动时的位置以及顶部UIScrollView移动时的位置,并将逻辑全部放入在一种方法中报告两个位置,当任何一个移动时,这不是我正在寻找的。

感谢任何帮助。很想解决这个特殊的问题,但也非常想了解我接近这个问题的任何更大的问题。还是新的。一直在想我已经掌握了它,然后我遇到了一些让我陷入困境的东西..

2 个答案:

答案 0 :(得分:14)

这正是UIScrollView参数的用途。在IB中创建与scrollView1和scrollView2的连接,然后执行以下操作:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if (scrollView1 == scrollView) {
        // Do stuff with scrollView1
    } else if (scrollView2 == scrollView) {
        // Do stuff with scrollView2
    }
}

答案 1 :(得分:0)

没有理由为什么同一个对象不能成为几个不同的滚动视图的委托。 -scrollViewDidScroll:向您传递相关的scrollview的原因是,您知道哪个 scrollview确实滚动了。

这是委托消息的一般模式。