我对这个问题感到震惊,我知道这必须是可能的,但是在仔细阅读了所有文档之后,我仍然无法想出能够运作良好的文章。
基本上,我在UITableView的LAST单元格中有一个UICollectionView。我想要发生的是,只有当UITableView完全滚动到底部时,它的最后一个单元格中的UICollectionView才能开始滚动。并且,如果TableView偏移在拖动/平移期间到达CollectionView的tableviewcell的底部,则当前表视图拖动/平移的任何其他拖动都应该影响集合视图而不是表视图。
此外,当集合视图滚动时,如果用户开始在集合视图上滚动,如果集合视图到达它的顶部滚动(内容Y偏移为0或更小),并且另外滚动影响中的当前平移/拖动手势应该使包含的表视图向上滚动。
我想实现这种效果的原因是因为包含集合视图的最后一个单元格上方的表格视图单元格包含一个UISegmentControl,用于切换UICollectionView的内容,我希望用户能够切换此段在CollectionView中滚动的任何时候。这意味着集合视图必须滚动,但父表视图不需要滚动..
我尝试过使用手势识别器,并使用
做一些事情– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
这让我到了那里,如果集合视图要滚动到负偏移量(过去它的顶部偏移量)或者是否已达到表格视图,我可以使用一个标志来返回此方法的是/否它的总滚动结束了......我有点接近我想要实现的目标,但是如果我在集合视图上慢慢向上滚动,它不会触发同时识别器,如果我发生同样的事情就会发生向下滚动表格视图太慢了。
另一个问题是,我不希望集合视图反弹。但是,将弹跳设置为“完全”会完全阻止同时识别器触发。我甚至尝试将内容偏移设置到CGPointZero的集合视图中,如果它的y偏移低于零,则在它的viewDidScroll中。这也不起作用,并阻止同步方法发射...
有谁知道该怎么办?还是有什么能指引我走向正确的方向?
更新 -
仍在努力,我在实现这一目标方面取得的进展甚微。我已经在viewDidScroll方法中切换了userInteractionEnabled,就像我在willBeginDragging中尝试过的那样。与scrollEnabled属性相同..没有运气:(我得到的行为类似于我想要的行为,但是父视图不会向上滚动,直到用户离开屏幕并尝试再次滚动..
更新 -
是否有转换当前处理滚动事件的panGestureRecognizer在滚动期间?如果我可以将滚动处理程序从子项转换为父项,同时仍然滚动这将解决我的问题。我查看过与苹果相关的手势和uiscrollview相关文档,但却找不到与此相关的任何内容。
更新 -
刚尝试这样的事情......
- (CGPoint)maxParentContentOffset
{
return CGPointMake(0, self.parentScrollView.contentSize.height - self.frame.size.height - 44);
}
- (void)parentScrollViewDidScroll:(UIScrollView *)parentScrollView
{
if (self.contentOffset.y > 0) {
self.parentScrollView.contentOffset = [self maxParentContentOffset];
}
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y < 0) {
scrollView.contentOffset = CGPointZero;
}
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
CGPoint translation = [scrollView.panGestureRecognizer velocityInView:scrollView.superview];
if (translation.y < 0) {
[UIView animateWithDuration:0.5f animations:^(void) {
self.parentScrollView.contentOffset = [self maxParentContentOffset];
}];
}
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
但是有一个问题...由于某种原因,我继续在以下方法中获得错误的访问错误
- (void)parentScrollViewDidScroll:(UIScrollView *)parentScrollView
{
if (self.contentOffset.y > 0) {
self.parentScrollView.contentOffset = [self maxParentContentOffset];
}
}
专门设置内容偏移量。这真的很奇怪,因为有了断点,我看到parentScrollView和self被设置了。我想知道它是不是一个糟糕的访问,但由于某种原因它被困在无限循环中?有什么想法吗?
答案 0 :(得分:3)
在8小时之后计算出来。由于父滚动视图偏移的无限设置,我有一个冲突,因为我有多个对象,只要他们的父视图滚动,就会收到一个调用的同一个类,尝试将相同的父视图偏移设置为零,这导致另一个类看到滚动更改,并调用其方法来更改偏移量,并且该过程无限地发生导致崩溃。
然而,这段代码完全按照我的意愿解决了所有问题。希望这有助于将来的其他任何人希望在父级和子级滚动视图之间进行全等滚动。
- (CGPoint)maxParentContentOffset
{
return CGPointMake(0, self.parentScrollView.contentSize.height - self.frame.size.height - 44);
}
- (void)parentScrollViewDidScroll:(UIScrollView *)parentScrollView
{
if (self.contentOffset.y > 0 && self.isDragging) {
self.parentScrollView.contentOffset = [self maxParentContentOffset];
}
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y < 0) {
scrollView.contentOffset = CGPointZero;
}
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
CGPoint translation = [scrollView.panGestureRecognizer velocityInView:scrollView.superview];
if (translation.y < 0) {
[UIView animateWithDuration:0.5f animations:^(void) {
self.parentScrollView.contentOffset = [self maxParentContentOffset];
}];
}
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
答案 1 :(得分:3)
即使您现在可以设法使其工作,在表视图(两个UIScrollView
子类)中嵌入集合视图也不是一个好主意,只要苹果修改它们的实现它就会出错。
尝试迁移到单个UICollectionView
布局。毕竟,使用表格视图可以实现的集合视图无法实现。
将您的&#34;表视图分开&#34;和&#34;收集视图&#34;在两个(或更多)集合视图部分中,然后根据layoutAttributesForItemAtIndexPath:
以不同方式实现indexPath.section
。
要使其成为表视图,您希望返回width
与集合视图相同的帧。
如果您的布局更简单,那么您可以使用UICollectionViewFlowLayout
(可能是您已经存在的)并按上述方式实施collectionView:layout:sizeForItemAtIndexPath:
。
答案 2 :(得分:0)
在我工作过的应用程序中,我们需要一些接近它的东西,我们希望在另一个uitableview
的第一个单元格中有一个uitableview,
,它应该是可滚动的(你可以查看)应用here)
我们的方法完全不同,我们考虑按照你的方式做到这一点,但这种方式对我们的时间来说有点过分,并且需要太多的自定义控制而不是使用苹果已经给我们的东西。 我将分享我们的方法只是为了让您有另一种方法来解决您的问题,因为我无法弄清楚该方法调用中的错误。
在外部tableview的数据源生命周期中,我们能够知道内部表视图的方式,允许我们向内部表视图提供所有数据,这样就可以得到{{1} }。
有了这些信息,并且因为我们知道(在您的情况下,您知道)内部表视图所在的实际单元格,我们total content size of the inner table view
。这样,内部表视图在外部表视图单元格中是完全可见的(在您的情况下是集合视图),但由于单元格太大,看起来我们正在滚动内部表当我们简单地滚动一个非常大的,特殊的单元格时。
如果你不想要它,它也不会反弹。
在我们的案例中,这很有效,而且实施非常简单。
在您的情况下,由于您有make that cell's height equal to the height of the inner tableview content size
,因此在UISegmentedController
按下后,您应该执行beginUpdates
endUpdates
和“重新加载数据”,在外部表视图中,以便能够重新计算集合视图的内容大小并调整最后一个单元格的大小,但这非常简单。
我知道我没有回答你的问题,但是这种方法让我们能够以如此快速和直接的方式实现如此相似的东西,我认为值得分享。
希望它有所帮助。