簡體   English   中英

兩個UICollectionView可以響應單個手勢嗎?

[英]Can two UICollectionViews respond to a single gesture?

我有兩個全屏子UICollectionViews 一個是在另一個上的透明覆蓋。 我希望它們在屏幕上拖動時都能夠做出響應-當它們是水平拖動時它們都可以響應,而當它是垂直拖動時它們都可以只響應其中一個,有點像某些Media Center主屏幕。 是否可以在不重新實現私有UICollectionView手勢識別器的情況下實現?

如果不是這樣的話,任何對示例重新實現的指示將不勝感激。

我知道或嘗試過的一些事情:

我在View Controller上有一個延遲開始的平移手勢識別器,可以在事件發送到視圖之前檢測垂直或水平移動。

我知道,僅從父視圖的touchesBegan:等轉發事件是行不通的,因為touches的view屬性設置為父視圖,並且UITouches無法復制(至少天真),因為它們未實現NSCopying協議。 也許我可以綜合合適的UITouch事件並轉發它們?

我知道我可以手動發送scrollToItemAtIndexPath:atScrollPosition:animated:消息,但我希望對集合具有自然的拖動,滑動和捕捉分頁行為。

或者,是否可以修改私有手勢識別器的委托並實現gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: -無需顯式訪問私有API-允許兩個集合都看到觸摸? 響應者鏈是否足夠聰明,可以從兩個同級視圖中使用手勢識別器來調用它?

另一種方法可能是手動控制疊加層,而不是將其作為“集合視圖”進行管理,但是“集合視圖”看起來更自然,並且理論上可以提供我想要的交互性。 目前,盒子似乎需要撬棍才能進入!

這個問題似乎很相似(如果不太明確),沒有答案。 我看過的其他問題似乎都與添加捏或使集合的子視圖也響應手勢有關。 不完全是我的情況。

我有點撓頭,因此感謝您的指導。

簡短的答案是,您無論如何都無法輕松進行。

對我有用的方法簡單得多,也更簡潔:將一個集合視圖嵌入另一個視圖。 包含頁面的頁面僅限於水平滾動,而覆蓋的頁面僅限於垂直滾動兩者。 兩者都與它們的委托和數據源共享相同的控制器,並且-由於集合視圖是滾動視圖的子類-這還可以跟蹤scrollViewDidEndDecelerating:方法中我們在哪個容器和覆蓋頁面上:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    if ([scrollView isEqual:containerCollection]) {
        containerNumber = scrollView.contentOffset.x / scrollView.frame.size.width;
    }
    else {
        overlayNumber = scrollView.contentOffset.y / scrollView.frame.size.height;
    }
}

唯一真正cellForItemAtIndexPath:地方是在我的cellForItemAtIndexPath:方法中,當我實例化容器單元時,我需要注冊.xibs以便重用(每個疊加層都不同),並使用記住的疊加層頁面,並同時發出scrollToItemAtIndexPath: reloadItemsAtIndexPaths:到嵌入的疊加層集合以使其正確顯示。

我還設法將兩個單元都保持為單獨的.xib,並為它們需要的任何額外數據提供了關聯的便捷類(對於容器集合,則是覆蓋集合IBOutlet)。

而且不是手勢識別器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM