抽屉
//
// MenuViewController.h
// DrawerDemo
//
// Created by 他年 on 16/4/14.
// Copyright © 2016年 浮夸. All rights reserved.
//
#import <UIKit/UIKit.h>
@protocol MenuClickDelegate <NSObject>
- (void)didClickMenuIndex:(NSInteger)index Title:(NSString *)title;
@end
@interface MenuViewController : UIViewController
///左侧菜单Controller
@property(nonatomic,strong)UIViewController *leftViewController;
///中间菜单Controller
@property(nonatomic,strong)UIViewController *centerViewController;
///当前菜单的状态
@property(nonatomic,assign,readonly)BOOL isShowing;
///菜单里面的菜单项
@property(nonatomic,strong)NSMutableArray *menuArray;
//点击接收数据的代理
@property(nonatomic,weak)id<MenuClickDelegate>menuDelegate;
///第三方的初始化方法
+ (instancetype)instanceWithLeftViewController:(UIViewController *)leftVC centerViewController:(UIViewController *)centerVC;
///获取抽屉的方法
+ (instancetype)getMenuViewController;
///展示左侧菜单
- (void)showLeftViewController;
///关闭左侧菜单
- (void)hideLeftViewControlller;
@end
//
// MenuViewController.m
// DrawerDemo
//
// Created by 他年 on 16/4/14.
// Copyright © 2016年 浮夸. All rights reserved.
//
#import "MenuViewController.h"
//抽屉的展开的尺度
#define kMenuLdftWidth [UIScreen mainScreen].bounds.size.width * 0.7
@interface MenuViewController ()<UITableViewDataSource,UITableViewDelegate>
///默认左侧的UITableView
@property(nonatomic,strong)UITableView *leftTableView;
@end
@implementation MenuViewController
//判断当前是否展开
- (BOOL)isShowing
{
if (self.centerViewController.view.transform.tx > 0) {
return YES;
}
return NO;
}
#pragma mark - 初始化方法
static MenuViewController *menuVC = nil;
+ (instancetype)instanceWithLeftViewController:(UIViewController *)leftVC centerViewController:(UIViewController *)centerVC
{
@synchronized(self) {
if (!menuVC) {
menuVC = [[MenuViewController alloc]init];
//设置Window的rootViewController
[UIApplication sharedApplication].keyWindow.rootViewController = menuVC;
//设置属性
menuVC.leftViewController = leftVC;
menuVC.centerViewController = centerVC;
//添加子视图控制器和子视图
if (leftVC) {
[menuVC addChildViewController:leftVC];
[menuVC.view addSubview:leftVC.view];
}else{
[menuVC setupLeftViewController];
}
if (centerVC) {
[menuVC addChildViewController:centerVC];
[menuVC.view addSubview:centerVC.view];
}
}
}
return menuVC;
}
//默认的菜单视图
- (void)setupLeftViewController
{
self.leftTableView = [[UITableView
alloc]initWithFrame:CGRectMake(-kMenuLdftWidth, 0, kMenuLdftWidth,
self.view.frame.size.height) style:(UITableViewStyleGrouped)];
//设置数据源
self.leftTableView.dataSource = self;
//代理
self.leftTableView.delegate = self;
[self.view addSubview:self.leftTableView];
}
#pragma mark - UITableViewDataSource
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.menuArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *reuserID = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuserID];
if (!cell) {
cell =[[UITableViewCell alloc]initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:reuserID];
}
cell.textLabel.text = self.menuArray[indexPath.row];
return cell;
}
//meunArray的setter方法
- (void)setMenuArray:(NSMutableArray *)menuArray
{
if (_menuArray != menuArray) {
_menuArray = nil;
_menuArray = menuArray;
[self.leftTableView reloadData];
}
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//取消选中状态(点进去的默认是上一次点击的)
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//代理 传值
if ([self.menuDelegate respondsToSelector:@selector(didClickMenuIndex:Title:)]) {
[self.menuDelegate didClickMenuIndex:indexPath.row Title:self.menuArray[indexPath.row]];
}
//关闭抽屉
[self hideLeftViewControlller];
}
#pragma mark - 获取抽屉的方法
+ (instancetype)getMenuViewController
{
return menuVC;
}
#pragma mark - 展开左侧菜单
-(void)showLeftViewController
{
//动画展开
[self showLeftViewController:0.7];
}
- (void)showLeftViewController:(CGFloat)duration
{
[UIView animateWithDuration:0.5 animations:^{
self.centerViewController.view.transform = CGAffineTransformMakeTranslation(kMenuLdftWidth, 0);
self.leftViewController.view.transform = CGAffineTransformMakeTranslation(kMenuLdftWidth, 0);
self.leftTableView.transform = CGAffineTransformMakeTranslation(kMenuLdftWidth, 0);
}];
}
#pragma mark - 关闭左侧菜单
- (void)hideLeftViewControlller
{
//动画关闭
[self hideLeftViewControlller:0.7];
}
- (void)hideLeftViewControlller:(CGFloat)duration
{
[UIView animateWithDuration:0.5 animations:^{
self.centerViewController.view.transform = CGAffineTransformMakeTranslation(0, 0);
self.leftViewController.view.transform = CGAffineTransformMakeTranslation(0, 0);
self.leftTableView.transform = CGAffineTransformMakeTranslation(0, 0);
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
//平移手势
UIPanGestureRecognizer *panMenu = [[UIPanGestureRecognizer
alloc]initWithTarget:self action:@selector(panMenuWithPanGesture:)];
[self.view addGestureRecognizer:panMenu];
}
// 静态变量保存初始状态
static CGPoint begin;
static CGAffineTransform transform;
- (void)panMenuWithPanGesture:(UIPanGestureRecognizer *)pan {
//位移量
CGPoint translatePoint = CGPointZero;
// 开始手势时的位置
if (pan.state == UIGestureRecognizerStateBegan) {
begin = [pan locationInView:self.view];
transform = self.centerViewController.view.transform;
}
// 手势过程中的位置
if (pan.state == UIGestureRecognizerStateChanged) {
CGPoint end = [pan locationInView:self.view];
translatePoint = CGPointMake(end.x - begin.x, 0);
}
//手势结束时的位置
if (pan.state == UIGestureRecognizerStateCancelled || pan.state == UIGestureRecognizerStateEnded) {
if (self.centerViewController.view.transform.tx > kMenuLdftWidth * 0.5) {
// 动画设置动画时长
[self showLeftViewController:0.13];
}else {
[self hideLeftViewControlller:0.13];
}
return;
}
// 手势过程中,对视图进行位移
if(self.centerViewController.view.transform.tx >= 0 &&
self.centerViewController.view.transform.tx <= kMenuLdftWidth) {
self.centerViewController.view.transform = CGAffineTransformTranslate(transform, translatePoint.x, 0);
self.leftViewController.view.transform = CGAffineTransformTranslate(transform,translatePoint.x, 0);
self.leftTableView.transform = CGAffineTransformTranslate(transform, translatePoint.x, 0);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
调用抽屉
// AppDelegate.m
// DrawerDemo
//
// Created by 他年 on 16/4/14.
// Copyright © 2016年 浮夸. All rights reserved.
//
#import "AppDelegate.h"
#import "MenuViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//抽屉的使用方法
[self.window makeKeyAndVisible];
[MenuViewController instanceWithLeftViewController:nil centerViewController:self.window.rootViewController];
[MenuViewController getMenuViewController].menuArray = [@[@"开通会员",@"QQ钱包",@"个性装扮",@"我的收藏"]mutableCopy];
return YES;
}
/ ViewController.m
// DrawerDemo
//
// Created by 他年 on 16/4/14.
// Copyright © 2016年 浮夸. All rights reserved.
//
#import "ViewController.h"
#import "MenuViewController.h"
@interface ViewController ()<MenuClickDelegate>
//显示 传输过来的值
@property (strong, nonatomic) IBOutlet UILabel *menuLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem
alloc]initWithImage:[UIImage imageNamed:@"导航"]
style:(UIBarButtonItemStylePlain) target:self
action:@selector(didClickLeftBarBtnIem:)];
//设置为菜单的代理
[MenuViewController getMenuViewController].menuDelegate = self;
}
- (void)didClickLeftBarBtnIem:(UIBarButtonItem *)sender
{
//判断菜单展示状态
if ([MenuViewController getMenuViewController].isShowing ) {
//关闭菜单方法
[[MenuViewController getMenuViewController] hideLeftViewControlller];
}else{
//打开菜单方法
[[MenuViewController getMenuViewController] showLeftViewController];
}
}
#pragma mark - MenuClickDelegate
//点击菜单传递的值
- (void)didClickMenuIndex:(NSInteger)index Title:(NSString *)title
{
self.menuLabel.text = [NSString stringWithFormat:@"第%ld项:%@",index,title];
}