抽屉

//
//  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];
    
    
}

posted on 2016-04-14 17:16  江户川峒天  阅读(105)  评论(0编辑  收藏  举报

导航