我的目标:有一个滑动菜单,当它打开时会推送我的应用程序的当前 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
占用所有空间和 MenuViewController
在 ContentViewController
下方.SlidingViewController
仅管理滑动交互,无论是来自平移手势还是来自方法调用。当该显示菜单时,SlidingViewController
将转移 ContentViewController
使MenuViewController
可见(通过更改 transform
或 frame
属性)。ContentViewController
和 MenuViewController
只是真实 View Controller 的容器。您使用这些容器以便您可以对它们做任何您想做的事情(例如,如果您想做一些非常时髦的动画)而不影响真正的 View Controller 。
所以 View Controller 层次结构看起来像这样:
滑动 View Controller
/\
菜单 View Controller 内容 View Controller
| |
UITableViewController 等 UINavigationController 等
关于ios - 继承 UINavigationController 并添加滑动菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17412775/