ios - 继承 UINavigationController 并添加滑动菜单

标签 ios objective-c uinavigationcontroller

我的目标:有一个滑动菜单,当它打开时会推送我的应用程序的当前 View 。

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

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

我读过很多关于 pointInside 的文章和 hitTest这可以帮助我实现我想要的,但仍然无法以适合我需要的方式实现它。

我知道 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 应用程序?我认为更好的设计是有一个管理滑动的父 View Controller 和两个 subview Controller ,一个用于菜单,一个用于内容。

编辑
SlidingViewController有两个 subview Controller :一个 ContentViewController占用所有空间和 MenuViewControllerContentViewController 下方.
SlidingViewController仅管理滑动交互,无论是来自平移手势还是来自方法调用。当该显示菜单时,SlidingViewController将转移 ContentViewController使MenuViewController可见(通过更改 transformframe 属性)。
ContentViewControllerMenuViewController只是真实 View Controller 的容器。您使用这些容器以便您可以对它们做任何您想做的事情(例如,如果您想做一些非常时髦的动画)而不影响真正的 View Controller 。

所以 View Controller 层次结构看起来像这样:

滑动 View Controller
/\
菜单 View Controller 内容 View Controller
| |
UITableViewController 等 UINavigationController 等

关于ios - 继承 UINavigationController 并添加滑动菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17412775/

相关文章:

ios - 如何在 ios 中从一个 View 导航到另一个 View ?

iphone - UIButton 触摸内部事件,边界发生变化?

ios - 如何在 UIButton 的文本边缘添加额外的空间?

ios - 如何获取 UIMoreListController(私有(private)框架类)的 subview Controller ?

ios - 为所有 UINavigationBar 设置颜色

iphone - 调用 popToRootViewControllerAnimated :NO, 将 animate 设置为 YES 时崩溃,工作没有崩溃,奇怪。

iOS Swift - Google Place API(Web)以奇怪的格式返回 JSON

ios - 我应该在嵌套 block 中使用 weakSelf 吗?

objective-c - 核心数据 : An Inverse Relationship to multiple entities?

objective-c - 以编程方式创建变量