繁体   English   中英

子类化UINavigationController并添加滑动菜单

[英]subclassing UINavigationController and adding a sliding menu

我的目标:有一个滑动菜单,可以在打开时推送我应用的当前视图。

我已经将我的UINavigationController子类化,以便创建自定义的“后退”按钮和右侧菜单中的滑动。 为此,在我的子类UINavigationController我将当前UIViewControllerself.view.fram )的x原点更改为将其移动到左侧x = -100; 通过这样做,我暴露了正确的菜单。

完成上述操作后,我发现通过移动self.view我也移动了可触摸区域,因此右侧菜单上的按钮将无法访问\\可点击。

我已经阅读了很多关于pointInsidehitTest ,它可以帮助我实现我想要的但仍然无法以满足我需求的方式实现它。

我知道github上有1000个开源项目,它们正是我想要的,但我想把它自己写下来并更好地理解它。

谢谢。

NavControllerSubCls.h:

@interface NavControllerSubCls : UINavigationController <UINavigationControllerDelegate>

@property (nonatomic, strong) UIView *testView;
@property (nonatomic, strong) UIButton *rightMenuBtn;

@end

NavControllerSubCls.m:

-(void)viewDidLoad
{
    [super viewDidLoad];


    UIView *navBar = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 41)];
    navBar.backgroundColor = [UIColor blueColor];
    UIImageView *bkrNavBar = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 39)];
    [navBar addSubview:bkrNavBar];    


    _rightMenuBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [_rightMenuBtn setFrame:CGRectMake(240, 20, 52, 19)];
    [_rightMenuBtn setTitle:@"Click" forState:UIControlStateNormal];
    [_rightMenuBtn addTarget:self action:@selector(showRightMenu) forControlEvents:UIControlEventTouchUpInside];
    [navBar addSubview:_rightMenuBtn];    

    _testView = [[UIView alloc]initWithFrame:CGRectMake(300, 20, 120, 100)];
    _testView.backgroundColor = [UIColor greenColor];

    UIButton *testBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    testBtn.frame = CGRectMake(0, 0, 120, 100);
    [testBtn addTarget:self action:@selector(doSomething) forControlEvents:UIControlEventTouchUpInside];

    [_testView addSubview:testBtn];
    [self.view addSubview:_testView];

    [self.view addSubview:navBar];    
    [self.view insertSubview:_testView aboveSubview:self.view];


}

-(void)doSomething
{
    NSLog(@"I'm Working!");
}


- (void)showRightMenu
{
    CGRect frame = self.view.frame;
    frame.origin.x = -100;
    self.view.frame = frame;
}

你的意思是Facebook应用程序? 我认为更好的设计是拥有一个管理滑动和两个子视图控制器的父视图控制器,一个用于菜单,另一个用于内容。

编辑

SlidingViewController有两个子视图控制器:一个ContentViewController ,占用了所有的空间和MenuViewController的下方ContentViewController

SlidingViewController仅管理滑动交互,无论是来自平移手势还是来自方法调用。 当显示菜单时, SlidingViewController将移动ContentViewController以便MenuViewController可见(通过更改transformframe属性)。

ContentViewControllerMenuViewController只是真实视图控制器的容器。 你使用这些容器,这样你就可以做任何你想做的事情(比如你想做一些非常时髦的动画),而不会影响真正的视图控制器。

所以视图控制器层次结构如下所示:

SlidingViewController
                   /             \
        MenuViewController    ContentViewController
                |                      |
UITableViewController, etc.   UINavigationController, etc.

暂无
暂无

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

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