熟悉移动开发的朋友对抽屉效果一定不陌生。现在看起来简单但我刚开始做公司的ios项目的时候,上网找很多资料,但大部分都是外部侧滑效果类似网易客户端的那种外部侧滑效果(为什么小日本非得要求内部侧滑,,,,)。后来经过”俺様”苦心研究终于搞定。
进入主题
1.创建一个主控制器,然后再包装成导航控制器。
@implementation AppDelegate
MainViewController *mainView = [[MainViewController alloc] init];
mainView.view.backgroundColor = [UIColor redColor];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:mainView];
[self.window setRootViewController:nav];
@end
@implementation Main01ViewController
self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithImageName:@"top_navigation_menuicon" target:selfaction:@selector(leftMenu)];
@end
3.侧滑效果实现。
我们首先需要在创建一个UIViewController,用来做第二层显示。
。。
@property (nonatomic, strong) UIViewController *UIViewController;
- (UIViewController *)secondUIViewController
{
if (!_secondUIViewController) {
UIViewController *uiView = [[UIViewController alloc] init];
_secondUIViewController = uiView;
}
return _secondUIViewController;
}
再将 secondUIViewController添加到主控制器上
[self.view addSubview:_secondUIViewController.view];
[self addChildViewController:_secondUIViewController];
点击导航栏左侧按钮,改变 secondUIViewController的frame,设定一个常量,就是偏移值。
#define ZLWidth 300
- (void)leftMenu
{
//取出导航控制器的view
UIView *show = self.UIViewController.view;
//复位
if (show.frame.origin.x == 0) {
[UIView animateWithDuration:0.25 animations:^{
CGRect frame = show.frame;
frame.origin.x = ZLWidth ;
show.frame = frame;
}];
} else {
[UIView animateWithDuration:0.25 animations:^{
CGRect frame = show.frame;
frame.origin.x = 0 ;
frame.origin.y = 0 ;
show.frame = frame;
}];
}
}
滑动实现抽屉效果,这个也很简单,当滑动屏幕时取出secondUIViewController,改变其frame,具体代码如下。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//取出导航控制器的view
UIView *show = self.UIViewController.view;
CGFloat x = show.frame.origin.x;
if (x < self.view.bounds.size.width && x >= 0) {
//获取touch对象
UITouch *touch = [touches anyObject];
//获取当前点
CGPoint currentPoint = [touch locationInView:self.view];
//获取上一个点
CGPoint prePoint = [touch previousLocationInView:self.view];
//x轴偏移量
CGFloat offsetX = currentPoint.x - prePoint.x;
//设置当前主视图的frame
//取出导航控制器的view
UIView *show = self.UIViewController.view;
CGRect frame = show.frame;
frame.origin.x += offsetX;
show.frame = frame;
}
}
以上
谢谢大家。