Art*_*eel 320 objective-c uinavigationcontroller uigesturerecognizer ios ios7
在iOS 7中,Apple添加了一个新的默认导航行为.您可以从屏幕的左边缘滑动以返回导航堆栈.但在我的应用程序中,此行为与我的自定义左菜单冲突.那么,是否可以在UINavigationController中禁用这个新手势?
Art*_*eel 578
我找到了解决方案:
Objective-C的:
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特3:
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
Ant*_*ine 46
我发现将手势设置为禁用只是并不总是有效.它确实有效,但对我而言,它只是在我曾经使用过背景后才做到的.第二次它不会触发反馈.
修复我的是委托手势并实现shouldbegin方法返回NO:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Disable iOS 7 back gesture
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// Enable iOS 7 back gesture
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
self.navigationController.interactivePopGestureRecognizer.delegate = nil;
}
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return NO;
}
Run Code Online (Sandbox Code Playgroud)
Vla*_*lov 29
只需从NavigationController中删除手势识别器.在iOS 8中工作.
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
[self.navigationController.view removeGestureRecognizer:self.navigationController.interactivePopGestureRecognizer];
Run Code Online (Sandbox Code Playgroud)
Cha*_*man 22
从iOS 8开始,接受的答案不再适用.我需要停止在我的主游戏屏幕上解除手势,所以实现了这个:
- (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;
}
Run Code Online (Sandbox Code Playgroud)
Ja͢*_*͢ck 20
我稍微改进了Twan的答案,因为:
nil当您返回到根视图控制器并在导航到其他地方之前进行滑动手势时,将委托设置为导致挂起问题.以下示例假设iOS 7:
{
id savedGestureRecognizerDelegate;
}
- (void)viewWillAppear:(BOOL)animated
{
savedGestureRecognizerDelegate = self.navigationController.interactivePopGestureRecognizer.delegate;
self.navigationController.interactivePopGestureRecognizer.delegate = self;
}
- (void)viewWillDisappear:(BOOL)animated
{
self.navigationController.interactivePopGestureRecognizer.delegate = savedGestureRecognizerDelegate;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
return NO;
}
// add whatever logic you would otherwise have
return YES;
}
Run Code Online (Sandbox Code Playgroud)
rez*_*afi 10
请在root vc中设置:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:YES];
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:YES];
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
}
Run Code Online (Sandbox Code Playgroud)
对于Swift:
navigationController!.interactivePopGestureRecognizer!.enabled = false
Run Code Online (Sandbox Code Playgroud)
swift 5、swift 4.2 可以使用下面的代码。
// disable
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
// enable
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
Run Code Online (Sandbox Code Playgroud)
如果要管理特定导航控制器的滑动功能,请考虑使用SwipeBack.
有了这个,你可以设置navigationController.swipeBackEnabled = NO.
例如:
#import <SwipeBack/SwipeBack.h>
- (void)viewWillAppear:(BOOL)animated
{
navigationController.swipeBackEnabled = NO;
}
Run Code Online (Sandbox Code Playgroud)
它可以通过CocoaPods安装.
pod 'SwipeBack', '~> 1.0'
Run Code Online (Sandbox Code Playgroud)
我为缺乏解释而道歉.
它适用于ios 10及更高版本:
- (void)viewWillAppear:(BOOL)animated {
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
}
Run Code Online (Sandbox Code Playgroud)
它不适用于viewDidLoad()方法.
| 归档时间: |
|
| 查看次数: |
136935 次 |
| 最近记录: |