self.navigationController.interactiveepogesturerecognizer.enabled=否;不在iOS 8中工作
我想在滑动viewcontroller时禁用弹出手势,但以下几行在iOS 8中不起作用:self.navigationController.interactiveepogesturerecognizer.enabled=否;不在iOS 8中工作,ios,objective-c,xcode,ios8,Ios,Objective C,Xcode,Ios8,我想在滑动viewcontroller时禁用弹出手势,但以下几行在iOS 8中不起作用: self.navigationController.interactivePopGestureRecognizer.enabled = NO; 提前感谢在要禁用viewcontroller的视图中,添加以下行: - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if ([self.navigati
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
提前感谢在要禁用viewcontroller的视图中,添加以下行:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return NO;
}
我在我的项目中使用此解决方案,它仅禁用InteractiveProgEstureRecognitor,并允许您使用其他手势识别器
- (void)viewDidLoad {
[super viewDidLoad];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([gestureRecognizer isEqual:self.navigationController.interactivePopGestureRecognizer]) {
return NO;
} else {
return YES;
}
}
下面的解决方案
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
__weak id weakSelf = self;
self.navigationController.interactivePopGestureRecognizer.delegate = weakSelf; }
导航控制器在其视图上安装此手势识别器,并使用它从导航堆栈中弹出最顶部的视图控制器。您可以使用此属性检索手势识别器,并将其与用户界面中其他手势识别器的行为联系起来。将手势识别器连接在一起时,确保它们同时识别自己的手势,以确保您的手势识别器有机会处理事件
通常我们需要在手动添加导航栏或自定义导航控制器时实现
快速版本
在RootViewController上添加协议UIgestureRecognitizerDelegate和Views将显示添加:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.interactivePopGestureRecognizer!.delegate = self }
我认为最简单的方法是在上面。
不应在viewDidLoad()中直接启用手势
但是,您可以在viewdide()之后更改它的状态。你知道这是在之后的,:-D你确定吗?当我在iOS 8中测试上述代码时,它起作用了。self.navigationController.interactiveepopgestrerecognizer.enabled=NO;不起作用,可能是iOS 8的一个bug你能解决iOS 8中的bug吗?我检查它对我不起作用。使用发布的代码,我可以成功禁用interactivePopGesture,而使用self.navigationController.InteractivePopgestureRecognitizer.enabled=否则不会禁用它。如果这不起作用,并且您是英国人,请确保您没有使用英语拼写。;)这是按照上面发布的iOS 8解决方案工作的,但是没有编译器警告,所以我不确定为什么其他人投了反对票,请评论原因。这似乎不是一个完整的解决方案。如果是的话,那么解释它为什么有效。如果不是,那么请说明您正在修改的答案。如何在swift中写入此内容获得
无法将类型(VC)的值分配给类型“UIgestureRecognitizerDelegate”
这对我来说很有效,应该是可接受的答案@Userich,干得好!这是一个很好的解决方案。你不需要这样做。self.navigationController.interactiveepogesturerecognizer.enabled=否;达拉,已经提供了多个答案,您能选择一个作为接受答案吗?所有答案都不适用于iOS 8:(尝试或不尝试这样做。首先,不清楚这将如何解决问题。它会禁用,然后在一段时间后启用。您试图做什么?其次,使用延迟是一种糟糕的编程实践。无法保证给定的延迟足够长,但不会太长-可能在安装识别器之前发生,或者在吃得足够多,用户可以在代码运行之前开始刷卡。不要使用延迟;而是使用苹果提供的方法,viewwillbeen
或viewdidebeen
,正如在回答之前很久发布的其他回答中所示。
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
});
}