2016-07-21 25 views
0

My-View-Controller in einer Navigationssteuerung eingebettet hält einen WKWebview, auf das ich die folgende Logik aktiviert werden soll:WKWebview allowsBackForwardNavigationGestures und UINavigationController interactivePopGestureRecognizer aktivierte beide

Wenn ein zurücker Artikel in der Webansicht vorhanden ist, eine linker Bildschirmrand geste sollte eine Seite in der Webansicht zurückgehen (normales Verhalten von Webview, wenn allowsBackForwardNavigationGestures auf yes gesetzt ist). Wenn kein Back Item mehr vorhanden ist, sollte eine Seite im Navigationscontroller (interactivePopGestureRecognizer) angezeigt werden. Ich habe beide aktiviert und bekomme zufällige Ergebnisse, manchmal gehe ich eine Seite in der Webansicht zurück und manchmal gehe ich zurück zu meiner Homepage im Navigationsstapel. Ich habe versucht, die folgende Logik:

-(void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation { 

    if (webView.backForwardList.backItem) { 
    MYappDelegate.mainNavigationController.interactivePopGestureRecognizer.enabled = NO; 
    self.webView.allowsBackForwardNavigationGestures = YES; 
    } else { 
    MYappDelegate.mainNavigationController.interactivePopGestureRecognizer.enabled = YES; 
    self.webView.allowsBackForwardNavigationGestures = NO; 
    } 
} 

aber es stürzt ab, wenn ich Swipe und ich „WKCompositingView Unbekannter Selektor an Instanz gesendet.“

Irgendwelche Ideen, wo ich falsch liege? Ich vermute, es gibt einen Konflikt darüber, welche Geste Priorität hat, aber ich kann nicht herausfinden, wo diese Logik hinzugefügt werden muss, damit sowohl der Webview als auch der Navigationscontroller, der den View-Controller enthält, friedlich leben.

Antwort

0

Ich habe ein gleiches Problem. Bitte versuchen Sie die folgende Art und Weise:

Zunächst fügen Sie eine benutzerdefinierte Geste zum WebView:

let swipe = UISwipeGestureRecognizer(target: self, action: #selector(goBack)) 
    swipe.direction = UISwipeGestureRecognizerDirection.right 
    swipe.delegate = self.navigationController 
    webView.addGestureRecognizer(swipe) 

dann, fügen Sie mit Geste gleichzeitig eine UIGestureDelegate Methode zu behandeln,

extension UINavigationController: UIGestureRecognizerDelegate{ 
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return gestureRecognizer is UIScreenEdgePanGestureRecognizer 
} 

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

}

Aber es hat einen kleinen Fehler, dass Wisch-Effekt unterscheidet sich von nativen, die neue AnsichtController beim Wischen ohne Ausbessern zeigen.