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