2013-09-22 68 views
15

所以我有一個導航控制器在我爲iOS 7應用程序構建。 titleView是可見的,以及後退按鈕和導航欄的自我。出於某種原因,交互式彈出手勢(從左邊滑動)不起作用。什麼都沒發生。當我登錄手勢時,它不是零。有什麼特別的我必須做,以啓用此功能?什麼可能導致它不工作?UINavigationController交互式流行手勢不起作用?

回答

25

嗯,貌似我不得不設置的動作代表和實現以下:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

    return YES; 

} 
+0

伊夫檢查這一點,但令人毛骨悚然的問題,當我有這個固定的,那麼如果用戶滑動一半然後回來看看下一個控制器重疊在前一個視圖控制器上。我看到前一個視圖控制器,下一個重疊像透明玻璃一樣透明。所以用戶恰好被鎖定了這個狀態。任何想法。這是View確實出現/將出現處理問題。 –

12

你可以把該線路viewDidLoad中方法。

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; 
+0

爲我工作..謝謝 – Simmy

15

看看這個response和評論。所有你所要做的就是設置你的瀏覽器的交互流行手勢識別的委託nil

self.navigationController.interactivePopGestureRecognizer.delegate = nil; 

其設置到一個鑄造自我id<UIGestureRecognizerDelegate>也是可行的,因爲在協議中所有的方法都是可選的,但我認爲設置委託到nil在這種情況下更合適。

+1

我只有在這方面的成功,當viewDidAppear – jonbauer

+6

這個「工程」,但不久後導致非常奇怪的問題,以凍結應用程序(測試iOS8,設備) – Ixx

5

更摸索出的答案是使亞倫和lojals

首先自定義導航控制器,然後把這個代碼的類

在viewDidLoad中,就把這行:

self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self; 

而且在類寫這個功能

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES;} 
18

我已經找到了th在使用自定義後退按鈕時,交互式彈出手勢停止工作(我認爲蘋果公司無法預見您的自定義後退按鈕的行爲方式,因此他們會禁用該手勢)。

要解決此問題,如前面提到的其他問題,可以將interactivePopGestureRecognizer.delegate屬性設置爲nil

在斯威夫特,這可以很容易地通過添加擴展整個應用程序做了UINavigationController這樣

extension UINavigationController { 

    override public func viewDidLoad() { 
     super.viewDidLoad() 
     interactivePopGestureRecognizer?.delegate = nil 
    } 

} 

更新答案

好像委託設置爲nil原因在某些情況下(例如,用戶在導航堆棧的頂部視圖控制器上向左或向右滑動時)應用UI被凍結。

因爲gestureRecognizerShouldBegin委託方法不能在擴展處理,繼承UINavigationController似乎是最好的解決辦法:和

class NavigationController: UINavigationController, UIGestureRecognizerDelegate { 

    /// Custom back buttons disable the interactive pop animation 
    /// To enable it back we set the recognizer to `self` 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     interactivePopGestureRecognizer?.delegate = self 
    } 

    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
     return viewControllers.count > 1 
    } 

} 
+3

這似乎工作,但事實證明,在某些情況下,它凍結了應用程序。我認爲這是在推送視圖控制器時觸發交互式彈出手勢時發生的。更安全的方法是將子類UINavigationController。在子類中,將'interactivePopGestureRecognizer.delegate'設置爲self,並防止在推送新視圖控制器時識別交互式彈出手勢。 – joern

+0

事實上,我也發現這個問題,似乎隻影響導航控制器堆棧的頂視圖控制器。我已經用基於子類的不同解決方案更新了我的答案。 –

+0

@Eneko Alonso完美!就像你所說的,如果用戶向左或向右滑動,然後點擊一個按鈕 - 推視圖控制器會出現故障。子類化修復了這個問題100% – Alex

相關問題