InteractivePopGestureRecognizer causing app freezing

前端 未结 9 1782
再見小時候
再見小時候 2021-01-31 10:29

In my app I have different controllers. When I push controller1 to navigation controller and swipe to back, all works good. But, if I push navigation controller1, and into contr

相关标签:
9条回答
  • 2021-01-31 10:48

    I solved my problem by UINavigationController interactivePopGestureRecognizer working abnormal in iOS7 and set self.navigationController.interactivePopGestureRecognizer.delegate = self; on every viewcontroller's - (void)viewWillAppear:(BOOL)animated

    0 讨论(0)
  • 2021-01-31 10:49

    I had same issue and I found below solution. add below controller

    #import <UIKit/UIKit.h>
    @interface CBNavigationController : UINavigationController     <UIGestureRecognizerDelegate,UINavigationControllerDelegate>
    @end
    
    #import "CBNavigationController.h"
    @interface CBNavigationController ()
    @end
    @implementation CBNavigationController
    - (void)viewDidLoad
    {
    NSLog(@"%s",__FUNCTION__);
    __weak CBNavigationController *weakSelf = self;
    
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
        self.interactivePopGestureRecognizer.delegate = weakSelf;
        self.delegate = weakSelf;
    }
    }
    
    - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
    NSLog(@"%s",__FUNCTION__);
    
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
        self.interactivePopGestureRecognizer.enabled = NO;
    
    [super pushViewController:viewController animated:animated];
    }
    
    #pragma mark UINavigationControllerDelegate
    - (void)navigationController:(UINavigationController *)navigationController
       didShowViewController:(UIViewController *)viewController
                    animated:(BOOL)animate
    {
    NSLog(@"%s",__FUNCTION__);
    
    // Enable the gesture again once the new controller is shown
    
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
        self.interactivePopGestureRecognizer.enabled = YES;
    }
    @end
    

    Can refer below link

    http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/

    0 讨论(0)
  • 2021-01-31 10:50

    My solution was to add a delegate to the navigation controller. Then disable the pop gesture recogniser in the root view controller only. YMMV.

    #pragma mark - UINavigationControllerDelegate
    
    - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        BOOL isRootVC = viewController == navigationController.viewControllers.firstObject;
        navigationController.interactivePopGestureRecognizer.enabled = !isRootVC;
    }
    
    0 讨论(0)
  • 2021-01-31 10:53

    Swift 4

    Add this code to root navigation controller

    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return self == self.navigationController?.topViewController ? false : true
    }
    

    Add UIGestureRecognizerDelegate protocol

    self.navigationController?.interactivePopGestureRecognizer?.delegate = self
    self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
    
    0 讨论(0)
  • 2021-01-31 10:55

    My solution is exchange self.navigationController.interactivePopGestureRecognizer.delegate between selfImplementDelegate and SystemDelegate

    - (void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        [_tableView reloadData];
        _oldReturnDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
        self.navigationController.interactivePopGestureRecognizer.delegate = self;
    }
    
    - (void)viewWillDisappear:(BOOL)animated
    {
        self.navigationController.interactivePopGestureRecognizer.delegate = _oldReturnDelegate;
        [super viewWillDisappear:animated];
    }
    
    0 讨论(0)
  • 2021-01-31 10:56

    I would suggest you to try this. This works perfectly for me. You can still enjoy Interactive swipe.

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
      if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] &&
          gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
        if(self.navigationController.viewControllers.count<=1)
        {
          return NO;
        }
      }
      return YES;
    }
    
    0 讨论(0)
提交回复
热议问题