我的目标:有一个滑动菜单,可以在我的应用打开时推送当前视图。
我已经将UINavigationController
子类化,以便创建自定义“后退”按钮并从右侧菜单中滑动。为此,在我的子类UINavigationController
中,我将当前UIViewController
(self.view.fram
)的x原点更改为将其移动到左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;
}
答案 0 :(得分:3)
你的意思是Facebook应用程序?我认为更好的设计是拥有一个管理滑动和两个子视图控制器的父视图控制器,一个用于菜单,另一个用于内容。
SlidingViewController
有两个子视图控制器:ContentViewController
占用了所有空间,MenuViewController
位于ContentViewController
下方。
SlidingViewController
仅管理滑动交互,无论是来自平移手势还是来自方法调用。在显示菜单时,SlidingViewController
会移动ContentViewController
,以便MenuViewController
可见(通过更改transform
或frame
属性)。
ContentViewController
和MenuViewController
只是真实视图控制器的容器。你使用这些容器,这样你就可以做任何你想做的事情(比如你想做一些非常时髦的动画),而不会影响真正的视图控制器。
因此视图控制器层次结构如下所示:
SlidingViewController / \ MenuViewController ContentViewController | | UITableViewController, etc. UINavigationController, etc.