it-swarm.com.de

Wie kann ich die zurück/linke Wischgeste in UINavigationController aktivieren, nachdem leftBarButtonItem gesetzt wurde?

Ich habe die gegenteilige Ausgabe von here ..__ erhalten. Standardmäßig in iOS7 konnte die zurückgelegte Geste von UINavigationControllers Stack die präsentierte ViewController anzeigen. Jetzt habe ich nur den gesamten self.navigationItem.leftBarButtonItem-Stil für alle ViewControllers-Dateien in Uniform dargestellt.

Hier ist der Code:

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:LOADIMAGE(@"back_button") style:UIBarButtonItemStylePlain target:self action:@selector(popCurrentViewController)];

danach ist der navigationController.interactivePopGestureRecognizer deaktiviert. Wie kann ich die Pop-Geste aktivieren, ohne die benutzerdefinierte leftBarButtonItem zu entfernen?

Vielen Dank!

53
Itachi

Erster Stellvertreter in viewDidLoad:

self.navigationController.interactivePopGestureRecognizer.delegate = self;

Und dann die Geste deaktivieren, wenn Sie drücken:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [super pushViewController:viewController animated:animated];
    self.interactivePopGestureRecognizer.enabled = NO;
}

Und in viewDidDisappear aktivieren:

self.navigationController.interactivePopGestureRecognizer.enabled = YES;

Fügen Sie Ihrem View-Controller auch UINavigationControllerDelegate hinzu. 

56
Lumialxk

Es funktioniert für mich, wenn ich den Delegierten setze

self.navigationController.interactivePopGestureRecognizer.delegate = self;

und dann umsetzen

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
44
hfossli

Sie müssen zwei Szenarien behandeln:

  1. Wenn Sie eine neue Ansicht auf den Stapel verschieben
  2. Wenn Sie den Root-View-Controller anzeigen

Wenn Sie nur eine Basisklasse benötigen, die Sie verwenden können, finden Sie hier eine Swift 3-Version:

import UIKit

final class SwipeNavigationController: UINavigationController {

    // MARK: - Lifecycle

    override init(rootViewController: UIViewController) {
        super.init(rootViewController: rootViewController)
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

        delegate = self
    }

    required init?(coder aDecoder: NSCoder) { 
        super.init(coder: aDecoder) 

        delegate = self 
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // This needs to be in here, not in init
        interactivePopGestureRecognizer?.delegate = self
    }

    deinit {
        delegate = nil
        interactivePopGestureRecognizer?.delegate = nil
    }

    // MARK: - Overrides

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        duringPushAnimation = true

        super.pushViewController(viewController, animated: animated)
    }

    // MARK: - Private Properties

    fileprivate var duringPushAnimation = false

}

// MARK: - UINavigationControllerDelegate

extension SwipeNavigationController: UINavigationControllerDelegate {

    func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        guard let swipeNavigationController = navigationController as? SwipeNavigationController else { return }

        swipeNavigationController.duringPushAnimation = false
    }

}

// MARK: - UIGestureRecognizerDelegate

extension SwipeNavigationController: UIGestureRecognizerDelegate {

    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        guard gestureRecognizer == interactivePopGestureRecognizer else {
            return true // default value
        }

        // Disable pop gesture in two situations:
        // 1) when the pop animation is in progress
        // 2) when user swipes quickly a couple of times and animations don't have time to be performed
        return viewControllers.count > 1 && duringPushAnimation == false
    }
}

Wenn Sie am Ende als UINavigationControllerDelegate in einer anderen Klasse fungieren müssen, können Sie einen Delegatenweiterleiter schreiben ähnlich dieser Antwort .

Vom Quellcode in Objective-C angepasst: https://github.com/fastred/AHKNavigationController

39
iwasrobbed

es funktioniert für mich Swift 3 :

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

und in ViewDidLoad:

    self.navigationController?.interactivePopGestureRecognizer?.delegate = self
    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
39
Yahya Tabba

Dies ist die beste Methode zum Aktivieren/Deaktivieren des Streifens, um den View-Controller iniOS 10, Swift 3aufzurufen:

Für den ersten Bildschirm [Wo Sie die Wischgeste deaktivieren möchten]:  

class SignUpViewController : UIViewController,UIGestureRecognizerDelegate {

//MARK: - View initializers
override func viewDidLoad() {
    super.viewDidLoad()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    swipeToPop()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func swipeToPop() {

    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true;
    self.navigationController?.interactivePopGestureRecognizer?.delegate = self;
}

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {

    if gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer {
        return false
    }
    return true
} }

Für den mittleren Bildschirm [Wo Sie die Wischgeste aktivieren möchten]:

class FriendListViewController : UIViewController {

//MARK: - View initializers
override func viewDidLoad() {

    super.viewDidLoad()
    swipeToPop()
}

func swipeToPop() {

    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true;
    self.navigationController?.interactivePopGestureRecognizer?.delegate = nil;
} }
8
Mr. Bean

Durch das Einstellen einer benutzerdefinierten Zurück-Schaltfläche wird die Rückstreichefunktion deaktiviert.

Das Beste, was Sie tun können, ist die Unterklasse UINavigationViewController und die Festlegung als interactivePopGestureRecognizer-Delegat. Dann können Sie JA von gestureRecognizerShouldBegin zurückgeben, um den Rückzug zuzulassen.

Dies geschieht zum Beispiel in AHKNavigationController

Und hier eine Swift-Version: https://stackoverflow.com/a/43433530/308315

3
Axel Guilmin

Swift 3:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.navigationController?.interactivePopGestureRecognizer?.delegate = self
}

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

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return (otherGestureRecognizer is UIScreenEdgePanGestureRecognizer)
}
3
Josh O'Connor

Diese Antwort, aber mit Storyboard-Unterstützung.

class SwipeNavigationController: UINavigationController {

    // MARK: - Lifecycle

    override init(rootViewController: UIViewController) {
        super.init(rootViewController: rootViewController)
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

        self.setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.setup()
    }

    private func setup() {
        delegate = self
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // This needs to be in here, not in init
        interactivePopGestureRecognizer?.delegate = self
    }

    deinit {
        delegate = nil
        interactivePopGestureRecognizer?.delegate = nil
    }

    // MARK: - Overrides

    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        duringPushAnimation = true

        super.pushViewController(viewController, animated: animated)
    }

    // MARK: - Private Properties

    fileprivate var duringPushAnimation = false
}
0
Jonny