如何将一组UIScrollViews一起滚动?

时间:2010-03-02 22:00:25

标签: iphone cocoa-touch uitableview uiscrollview

设置:我有一个UITableView,每个UITableViewCell都有一个UIScrollView。我要做的是让所有UIScrollViews滚动到一起,这样当你滚动其中一个UIScrollViews时,所有UITableView似乎都会同时滚动。

我所做的是子类UIScrollViews,以便它的表格单元格中包含所有TouchesBegan的数组。然后,我将TouchesMovedTouchesCancelledTouchesEndedUITableViewUIScrollViews转发到了数组中的所有UIScrollViews

这似乎不起作用。 setContentOffset不滚动!我设法让这个工作的唯一方法是在scrollviews上调用UIScrollView:方法。但是,这是一个非常糟糕的解决方案,因为它没有为您提供UIScrollViews的滑动和减速功能。

关于为什么我的触摸方法无法进入{{1}}的任何想法?或者更好的方法来实现这个?

3 个答案:

答案 0 :(得分:6)

好的,让它运转起来。感谢Ricki提示!

要添加到Ricki解决方案中的两件事,如果要避免无限循环,则必须检查是否设置了scrollView的跟踪或拖动属性。这将确保只有实际被拖动的ScrollView才会调用委托。

- (void)scrollViewDidScroll:(UIScrollView *) theScrollView { 
         if (theScrollView.dragging || theScrollView.tracking) 
              [self.delegate scrolling:[theScrollView contentOffSet]]; 
}

此外,在委托的滚动方法中,我将动画设置为NO,这消除了初始滑动和其他滚动视图更新之间的延迟。

答案 1 :(得分:2)

我做了一些类似的事情,我在父视图中有4个scrollViews。 我在UIView中放置了一个scrollView,这个UIView从它的parentView传递了一个委托,这个视图跟踪了所有的scrollViews。包含scrollVIew的UIView实现了UIScrollViewDelegate和这个方法;

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

    [self.delegate scrolling:[self.scrollView contentOffSet]];

}

现在父视图在所有scrollViews上执行了此操作:

- (void) scrolling:(CGFloat) offset {

    for(UIScrollView *s in self) {
        [s setContentOffset:offset animated:YES];
    }
}

当然对CPU来说有点紧张,但在任何情况下滚动几个视图:/

希望这是你需要的方向,并且它是有道理的。

<强>加了:

在我开始工作之前,我带了8条不同的路径和大量的混乱。我提前放弃了touchBegan方法,没有办法写出接近苹果滑动,轻弹,滚动算法的东西。

我不知道tableview和scrollview是否会“窃取”彼此触摸事件,但正如我可以从你的描述中读到的那样,你可以使这部分工作。

后续想法以减轻CPU使用率。将每个scrollview添加到一个单元格,设置其tag = 14,现在当滚动只询问所有可见单元格时,请求viewWithTag = 14,在此设置contentOffset。全局保存内容偏移量,以便您可以将其分配给在cellForRowAtIndexPath中滚动到屏幕上的单元格。

因此,将offSet设置为全局属性,在cellForRowAtIndexPath中找到tag = 14的视图,设置其偏移量。这样,您甚至不需要仅对委托卷轴的引用。

答案 2 :(得分:0)

如果您使用不同大小的UIScrollView并使用分页,则效果很好:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView {
    #pragma unused(_scrollView)
    categoryPageControlIsChangingPage = NO;
    for (UIImageView *iv in [categoryScrollView subviews]) {
        iv.alpha = (iv.tag != categoryPageControl.currentPage+1)?0.5f:1.0f;
        ILogPlus(@"%i %i", iv.tag, categoryPageControl.currentPage+1);
    }
    [self scrolling:_scrollView];
}

- (void)scrolling:(UIScrollView *)sv {
    CGFloat offsetX = sv.contentOffset.x;
    CGFloat ratio = offsetX/sv.contentSize.width;

    if ([sv isEqual:categoryScrollView]) {
        [categoryScrollViewLarge setContentOffset:CGPointMake(ratio*categoryScrollViewLarge.contentSize.width, 0) animated:YES];
    }else {
        [categoryScrollView setContentOffset:CGPointMake(ratio*categoryScrollView.contentSize.width, 0) animated:YES];
    }
}