對不起這樣一個長的問題,但覺得我應該傳達我所嘗試過的。處理多個視圖的UIPanGestureRecognizer手勢(一個覆蓋另一個)
我在導航控制器中有一個視圖viewA
。然後,我添加一個子視圖viewB
(包含UITableView
)到viewA
並偏移其原點高度,以便它只覆蓋屏幕的一半(另一半溢出屏幕底部)。我希望能夠向上拖動這個viewB
,但是當它碰到導航欄的底部時它會停下來,並且在碰到原點偏移點時向下拖動時也會停止。我已經取得了成功。
但是,我希望UITableView
交互僅在viewB
位於其上部位置時啓用,因此不會響應任何其他位置的手勢。本質上,拖動viewB
以使其完全覆蓋viewA
應啓用與UITableView
的交互。
這裏最棘手的部分是,我希望它做到以下幾點:
- 如果
viewB
處於較高位置,使其覆蓋屏幕,則UITableView
內容偏移爲0(即我們在桌子的頂部),並且用戶向下做平移手勢,該手勢不應該與UITableView
交互,而應該向下移動viewB
。 - 在上述情況下的任何其他平移手勢應該是與
UITableView
的交互。 - 如果
viewB
處於其上部位置,使得它覆蓋在屏幕上,所述UITableView
內容偏移是NOT在0(即,我們是NOT在表的頂部)和用戶做出平移姿勢向下,該手勢應該與UITableView
交互。
我一直非常接近實現這一點,但我不能完全正確。
嘗試到目前爲止
我使用UIPanGestureRecognizer
處理視圖的拖動。我曾嘗試將此添加到:
viewB
與UITableView
用戶交互最初禁用。這允許我上下拖動viewB
而不干擾UITableView
。一旦viewB
處於其上部位置,我啓用UITableView
用戶交互,然後正確地允許我與UITableView
交互,而不移動viewB
。然而,通過使
UITableView
用戶交互,這意味着觸摸從未到達UIPanGestureRecognizer
,這意味着我不能檢測用於上述點(1)所述的情況下,因而不能重新禁用UITableView
用戶交互作viewB
再次移動。也許有可能通過覆蓋
UITableView
使用的手勢識別方法來做到這一點?如果這是可能的,任何人都可以指向正確的方向?在
UITableView
前增加了一個新視圖。我想也許我可以在必要時將觸摸手勢轉發到背後的UITableView
,但我仍然沒有找到辦法做到這一點。我所能做的就是禁用手勢識別器,該手勢識別器允許我與
UITableView
進行交互,但之後出現與上述相同的問題。我無法檢測何時重新啓用它。UITableView
在viewB
之內。這似乎是迄今爲止最有前途的方式。通過設置以下方法的返回值,我可以啓用和禁用對viewB
和UITableView
的識別。func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { if pulloverVC.view.frame.origin.y == bottomNavbarY && pulloverVC.tableView?.contentOffset.y == 0 { // need to add gesture direction check to this condition viewBisAtTop = true return false // disable pullover control } return true // enable pullover control } func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { if (gestureRecognizer as! UIPanGestureRecognizer).velocityInView(view).y < 0 && viewBisAtTop { // gesture direction check not wanted here return true // enable tableview control } viewBisAtTop = false return false // disable tableview control }
頂部方法首先調用手勢(我檢查了打印語句)後跟底部方法。通過爲2種方法制作不同的真假組合,我可以在
viewB
和UITableView
之間交替進行交互。要檢測用戶是否向下滑動,我在識別器上調用
velocityInView()
(如底部方法所示)。我打算在頂部方法if
聲明中進行檢查,但我認爲這會起作用,但是,儘管velocityInView()
在底部方法中工作正常,但它不在頂部方法中(速度始終爲0)。
我有這麼蒐羅了一些解決方案,找到的姿態處理該相互覆蓋的看法很多類似的查詢,但這些似乎都關於一個手勢類型,例如在一個視圖上捏和另一種視圖,例如泛,另一方面。在我的情況下,兩種手勢類型都是相同的。
也許有人有一個聰明的想法?或者也許這其實很簡單,我已經使這個非常複雜? xD