禁用特定ViewController中的页面滑动

时间:2014-08-24 22:34:00

标签: ios objective-c uigesturerecognizer

我在控制器中使用github可用项目加载侧菜单视图控制器ResideMenu

它允许您链接按钮以呼叫侧面菜单或从手机的一侧滚动以显示菜单。

我想仅在mainViewController上禁用该特定功能。 菜单的操作从手机左侧一直滑到右侧,然后拉出侧边菜单。

我正在使用导航控制器和故事板

我会发布代码,但有很多,请告诉我是否应该寻找任何特定代码发布

2 个答案:

答案 0 :(得分:2)

所以这比我想象的要多一些。我创建了一个基于github中的RESideMenu提供的示例项目。

https://github.com/wottle/REsideDemoWithOnOff

在ExampleProjects目录中打开项目,看看它是如何工作的。

我所做的基础是:

修改现有协议以返回willShow...方法的BOOL。在实现中,我更改了代码以检查返回值,这决定了菜单是显示还是现在。然后,因为菜单的显示和隐藏是由根视图控制器(而不是每个单独的视图控制器)控制的,所以我创建了一个新协议,可以选择由您将显示的每个单独的视图控制器实现。

@protocol RESideViewDelegate <NSObject>
@optional
- (BOOL)shouldAllowMenu;
@end

每个视图控制器都符合此协议,在这种情况下,它们实现了它。如果它们不符合协议,默认情况下它们将允许显示菜单。以下是如何使各个视图控制器符合.h:

中的新协议
#import <UIKit/UIKit.h>
#import "RESideMenu.h"

@interface DEMOFirstViewController : UIViewController <RESideViewDelegate>
    - (BOOL) shouldAllowMenu;

@end

并在视图控制器的.m中,提供了shouldAllowMenu方法的实现:

#import "DEMOFirstViewController.h"

@interface DEMOFirstViewController ()

@end

@implementation DEMOFirstViewController


- (BOOL) shouldAllowMenu
{
    return YES;
}

@end

在第二个View控制器中,我返回no。所以第一个视图控制器允许菜单,第二个不允许。

 - (BOOL) shouldAllowMenu
{
    return NO;
}

然后,在根视图控制器的willShowMenuViewController实现中,我看到当前视图控制器是否符合协议,如果是,请调用该方法并将其传递回RESideMenu 。

- (BOOL)sideMenu:(RESideMenu *)sideMenu willShowMenuViewController:(UIViewController *)menuViewController
{
    NSLog(@"willShowMenuViewController: %@", NSStringFromClass([menuViewController class]));

    UINavigationController *navController = sideMenu.contentViewController;
    if( [navController.topViewController conformsToProtocol:@protocol(RESideViewDelegate) ])
    {
        UIViewController <RESideViewDelegate>*resideView = navController.topViewController;
        return [resideView shouldAllowMenu];
    }
    return NO;
}

我确认这是有效的,但需要花些精力将其纳入您的项目。为了跟踪我的更改,我更改了RESideMenu.m和RESideMenu.h,并将上面的更改更改为根视图控制器和内容视图控制器。

答案 1 :(得分:0)

#import "ReSideMenu.h"


Add these two methods:

-(void)viewDidAppear:(BOOL)animated{
    [self.sideMenuViewController setPanGestureEnabled:NO];
}

-(void)viewWillDisappear:(BOOL)animated{
    [self.sideMenuViewController setPanGestureEnabled:YES];
}