2

所以我意识到在所有的红旗上都有嵌套的滚动视图,但是除了一个小问题之外,目前的所有设置实际上都工作得很好。一个滚动视图管理在一个集合中滚动,另一个处理整个集合视图上的缩放和平移。这一切都有效,但小问题来自放大和向下平移时,滚动视图在collectionview滚动时平移,导致视图滚动两次,并且感觉不到手指的连接。在嵌套的UIScrollViews中处理冲突的手势

我理想想要发生的事情是垂直滚动是在可以平移时由外滚动视图管理,然后在外滚动视图不能再平移时由内滚动视图处理。我写这样的事情非常接近:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (scrollView == _outerScrollView) { 
     CGPoint offset = _outerScrollView.contentOffset; 
     CGFloat height = _outerScrollView.frame.size.height; 
     CGFloat contentHeight = _outerScrollView.contentSize.height; 

     ScrollDirection scrollDirection; 
     if (offset > _lastContentOffset){ 
      scrollDirection = ScrollDirectionUp; 
     } else { 
      scrollDirection = ScrollDirectionDown; 
     } 

     BOOL scrollIsAtTop = offset.y <= 0; 
     BOOL scrollIsAtBottom = offset.y + height >= contentHeight; 

     //If there is a pan upward and we aren't at the top of the outer 
     //scrollview cancel the gesture on the inner view 
     //downward vice versa 
     if (!((scrollIsAtTop && scrollDirection == ScrollDirectionUp) 
       || (scrollIsAtBottom && scrollDirection == ScrollDirectionDown))) { 
      _innerCollectionView.panGestureRecognizer.enabled = NO; 
      _innerCollectionView.panGestureRecognizer.enabled = YES; 
     } 
    } 
    _lastContentOffset = offset.y; 
} 

ALMOST作品,用大锅向下站之一的副作用,当它击中的底部,并要求用户启动一个新的姿态继续滚动与内部集合。理想情况下,这种过渡会很顺利,但我很难找出一种方法来做到这一点。我再次意识到滚动视图内的滚动视图并不理想,但如果我能解决这个小问题,一切都会很好,而不是试图重新设计整个事情。

关于如何以平移手势获胜的方式处理双滚动的任何想法,但在外滚动视图不能再垂直移动时干净地转换到内部集合?

+0

你有视频可以快速放在一起吗?或者可能会压缩项目? –

+0

不容易,如果我很快就找不到修复程序,我可以放一个演示项目来重现它,但它需要我一个小时左右,所以我会继续战斗,看看有没有人有任何好的建议与此同时。 –

+0

你有没有想过这个?我目前有同样的问题。 – ArtSabintsev

回答

2

所以,我从来没有得到任何答案,这是我一直在解决的解决方案。本质上,如果内部集合视图不在顶部或底部,我重置scrollViewDidScroll中外部滚动视图的y偏移量。代码如下所示:使用

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (scrollView == _outerScrollView) { 
     if (![self innerScrollIsAtTop] && ![self innerScrollIsAtBottom] && !self.allowOuterScroll) { 
      [scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, self.lastContentOffset)]; 
     } 
     self.lastContentOffset = scrollView.contentOffset.y; 
    } 
} 

这2个便利:

- (BOOL)innerScrollIsAtTop { 
    return _innerCollectionView.contentOffset.y <= 0; 
} 

- (BOOL)innerScrollIsAtBottom { 
    CGFloat zoom = self.zoomScale; 
    CGFloat height = _innerCollectionView.frame.size.height; 
    CGFloat contentHeight = _innerCollectionView.contentSize.height; 
    CGPoint offset = _innerCollectionView.contentOffset; 

    return offset.y + height/zoom >= contentHeight; 
} 

你还需要2类变量,一个浮子保持前一Y含量外滚动的偏移,以及布尔以保持是否允许滚动外滚动视图,您可以在缩放或编程滚动时将其设置为“是”。这个解决方案修复了双向滚动,但在scrollviewDidScroll中有一个繁琐的黑客攻击,可能会在稍后激发你,并且你经常需要解决,但现在这是我一直在使用的解决方案。

+0

感谢您的帮助。不幸的是,它没有奏效。 这里是我的具体问题:http://stackoverflow.com/questions/25793141/continuous-vertical-scrolling-between-uicollectionview-nested-in-uiscrollview – ArtSabintsev

+0

我今天晚些时候会看看 –

+0

不是一个坏的技巧来启用分页,以便快速向上/向下跳转。但我仍然想知道如何将外部滚动视图的速度传递给孩子。 Twitter在他们的个人资料页面上做了这件事,我对他们如何设法做到这一点很神秘。 – Oren