繁体   English   中英

InteractivePopGestureRecognizer导致应用程序冻结

[英]InteractivePopGestureRecognizer causing app freezing

在我的应用中,我有不同的控制器。 当我将controller1推到导航控制器并向后滑动时,一切正常。 但是,如果我推动导航控制器1,并进入controller1推控制器2并尝试向后滑动,我得到一个冻结的应用程序。 如果通过后退按钮返回一切正常。

我怎么能抓住这个问题?

使用刷卡到弹出手势时,我遇到了与冻结界面类似的问题。 在我的情况下问题是在controller1.viewDidAppear我禁用滑动手势: self.navigationController.interactivePopGestureRecognizer.enabled = NO 因此,当用户开始从contorller2向后滑动时,触发了controller1.viewDidAppear并且在其工作期间禁用了手势。

我通过在controller1中设置self.navigationController.interactivePopGestureRecognizer.delegate = self并实现gestureRecognizerShouldBegin:来解决这个问题,而不是禁用手势识别器:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] &&
            gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
        return NO;
    }
    return YES;
}

我的解决方案是向导航控制器添加一个委托。 然后仅在根视图控制器中禁用弹出手势识别器。 因人而异。

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    BOOL isRootVC = viewController == navigationController.viewControllers.firstObject;
    navigationController.interactivePopGestureRecognizer.enabled = !isRootVC;
}

当我在第一个控制器上向后滑动然后点击tableViewCell时我遇到了问题,我认为强制触摸从边缘滑动是在切换应用之前注册滑动,有时UI卡住,有时当我向后滑动它开始进入目标控制器。 我解决了这个扩展的问题,它对我有用,这是一个简单的解决方案。 Swift 4.2

extension UINavigationController:UINavigationControllerDelegate {

    open override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        if responds(to: #selector(getter: self.interactivePopGestureRecognizer)) {
            if viewControllers.count > 1 {
                interactivePopGestureRecognizer?.isEnabled = true
            } else {
                interactivePopGestureRecognizer?.isEnabled = false
            }
        }
    }
}

斯威夫特4:

设置代表,

self.navigationController?.interactivePopGestureRecognizer?.delegate = self

实现委托方法,

extension YourVC: UIGestureRecognizerDelegate{
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer && conditionToDisableTheGesture {
            return false
        }else{
            return true
        }
    }

}

我有同样的问题,我发现下面的解决方案。 添加以下控制器

#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

可以参考下面的链接

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

我的解决方案是selfImplementDelegateSystemDelegate之间的交换self.navigationController.interactivePopGestureRecognizer.delegate

- (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];
}

我建议你尝试一下。 这对我来说非常适合。 您仍然可以享受交互式滑动。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
  if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] &&
      gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
    if(self.navigationController.viewControllers.count<=1)
    {
      return NO;
    }
  }
  return YES;
}

斯威夫特4

将此代码添加到根导航控制器

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

添加UIGestureRecognizerDelegate协议

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

我解决了我的问题, UINavigationController interactivePopGestureRecognizer在iOS7中工作异常并设置了self.navigationController.interactivePopGestureRecognizer.delegate = self; 在每个viewcontroller的- (void)viewWillAppear:(BOOL)animated

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM