设置:我有一个UITableView
,每个UITableViewCell
都有一个UIScrollView
。我要做的是让所有UIScrollViews
滚动到一起,这样当你滚动其中一个UIScrollViews
时,所有UITableView
似乎都会同时滚动。
我所做的是子类UIScrollViews
,以便它的表格单元格中包含所有TouchesBegan
的数组。然后,我将TouchesMoved
,TouchesCancelled
,TouchesEnded
和UITableView
从UIScrollViews
转发到了数组中的所有UIScrollViews
。
这似乎不起作用。 setContentOffset
不滚动!我设法让这个工作的唯一方法是在scrollviews上调用UIScrollView
:方法。但是,这是一个非常糟糕的解决方案,因为它没有为您提供UIScrollViews
的滑动和减速功能。
关于为什么我的触摸方法无法进入{{1}}的任何想法?或者更好的方法来实现这个?
答案 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];
}
}