抽屉效果IOS---仿网易客户端的---初步完成封装---简单易用---IOS

这几天闲着没事,看了几个抽屉效果,总觉得大都写的有些复杂,便自己封装了一个.主要为了自己项目服务,主要按照网易客户端的样式封装,未提供更改中间视图frame的接口,有兴趣的话可以自己试着添加一个frame接口即可. (在ARC开启的情况下封装的)

核心功能:点击左抽屉中的cell,关闭抽屉,可以推出新的中间控制器,或者原本存在的控制器.

抽屉开启的情况下,点击中间视图,收回抽屉.

注意事项:中间视图必须是navigationcontroller,并自己在中间控制器类中重写item的左右button.

必须引入我的类目.最好放进pch文件中,

这是初始版本,肯定还有不尽完善的地方,不喜勿喷.动画等功能还未加入,主要完成抽屉的核心功能.

-------------------------------------------------------转载请注明出处--------------------------------------------------------

--------------------------------------------http://blog.csdn.net/u013082522------------------------------------------

--------------------示例代码下载http://download.csdn.net/detail/u013082522/6952231--------------

DrawerViewController.h

#import <UIKit/UIKit.h>
@protocol DrawerViewDelegate <NSObject>//协议,暂时未使用.

- (void)manageLeftDrawer;

- (void)manageRightDrawer;


@end

@interface DrawerViewController : UIViewController

@property(nonatomic,retain)UIViewController *LeftDrawerVC;

@property(nonatomic,retain)UIViewController *CenterDrawerVC;

@property(nonatomic,retain)UIViewController *RightDrawerVC;


//初始化方法

- (id)initWithLeftViewController:(UIViewController *)leftViewController centerViewController:(UIViewController *)centerViewController rightViewController:(UIViewController *)rightViewController;

//点击左右按钮

- (void)tapLeftDrawerButton;

- (void)tapRightDrawerButton;

//关闭左抽屉,方便调用

- (void)closeLeftDrawer;

//关闭右抽屉,方便调用

- (void)closeRightDrawer;



@end
DrawerViewController.m

#import "DrawerViewController.h"

@interface DrawerViewController ()

@property(nonatomic,assign)BOOL IsLeft;

@property(nonatomic,assign)BOOL IsRight;

@property(nonatomic,assign)BOOL LeftDrawerIsShow;

@property(nonatomic,assign)BOOL RightDrawerIsShow;

@property(nonatomic,retain)UITapGestureRecognizer *tapLeft;

@property(nonatomic,retain)UITapGestureRecognizer *tapRight;

@property(nonatomic,retain)UISwipeGestureRecognizer *swipeLeft;

@end

@implementation DrawerViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"11.jpg"]];
    }
    return self;
}

- (id)initWithLeftViewController:(UIViewController *)leftViewController centerViewController:(UIViewController *)centerViewController rightViewController:(UIViewController *)rightViewController
{
    self = [super init];
    
    if (self) {

        //加载左视图
        [self setLeftDrawerVC:leftViewController];
        [self.view addSubview:leftViewController.view];
        
        //加载右视图
        [self setRightDrawerVC:rightViewController];
        [self.view addSubview:rightViewController.view];
        
        //加载中间视图....中间视图一定要最后添加
        [self setCenterDrawerVC:centerViewController];
        //[self.view addSubview:_CenterDrawerVC.view];
        
        //设置左右抽屉的任意一个布尔值
        self.IsLeft = YES;
        self.IsRight = YES;
        
        //给定状态初始值
        self.LeftDrawerIsShow = NO;
        self.RightDrawerIsShow = NO;
        
        //将左控制器添加为子控制器,这样左边控制器才可以找到self
        [self addChildViewController:leftViewController];
        
        //将右控制器添加为子控制器,这样右边控制器才可以找到self
        [self addChildViewController:rightViewController];

    }
        return self;
}


//重写设置中间视图的set方法
- (void)setCenterDrawerVC:(UIViewController *)CenterDrawerVC
{
    if (_CenterDrawerVC == nil) {
        
        _CenterDrawerVC = CenterDrawerVC;
        [self.view addSubview:_CenterDrawerVC.view];
        [self addChildViewController:_CenterDrawerVC];
        NSLog(@"不存在");
        
    }else{
        
        UIViewController *oldVC = _CenterDrawerVC;
        _CenterDrawerVC = CenterDrawerVC;
        [self.view addSubview:_CenterDrawerVC.view];
        [oldVC removeFromParentViewController];
        [oldVC.view removeFromSuperview];
        [self addChildViewController:_CenterDrawerVC];
    }

    
}

- (void)addSwipeGeustureToLeft
{
    if (_LeftDrawerIsShow) {
        self.swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(tapLeftDrawerButton)];
        [_swipeLeft setDirection:UISwipeGestureRecognizerDirectionDown];
        [_CenterDrawerVC.view addGestureRecognizer:self.swipeLeft];
        
    }else{
        if (self.swipeLeft != nil) {
            [_CenterDrawerVC.view removeGestureRecognizer:_swipeLeft];
        }
    }
}




#pragma 点击手势方法

//当左抽屉处于打开状态的时候,在中间视图上添加单击手势,点击收回左抽屉

- (void)AddTapGestureToLeft
{
    if (_LeftDrawerIsShow) {
        self.tapLeft = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapLeftDrawerButton)];
        
        [_CenterDrawerVC.view addGestureRecognizer:self.tapLeft];
    }else{
        if (self.tapLeft != nil) {
            [_CenterDrawerVC.view removeGestureRecognizer:_tapLeft];
        }
    }
    
}

//当右抽屉处于打开状态的时候,在中间视图上添加单击手势,点击收回右抽屉
- (void)AddTapGestureToRight
{
    if (_RightDrawerIsShow) {
        
        self.tapRight = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRightDrawerButton)];
        
        [_CenterDrawerVC.view addGestureRecognizer:self.tapRight];
        
    }else{
        
        if (self.tapRight != nil) {
            
            [_CenterDrawerVC.view removeGestureRecognizer:_tapRight];
        }
    }
    
}
#pragma 左右button的点击事件
//左边点击事件
-(void)tapLeftDrawerButton
{
    
    _RightDrawerVC.view.hidden = YES;
    _LeftDrawerVC.view.hidden = NO;
    
    if (!self.IsLeft) {
        
        _CenterDrawerVC.view.frame = CGRectMake(0, 0, 320, 568);
        
        _IsLeft = YES;
        
        _LeftDrawerIsShow = NO;
        
        [self AddTapGestureToLeft];
        [self addSwipeGeustureToLeft];
        
    }else{
        
        _CenterDrawerVC.view.frame = CGRectMake(250, 50, 320, 400);
        
        _IsLeft = NO;
        
        _LeftDrawerIsShow = YES;
        
        [self AddTapGestureToLeft];
        [self addSwipeGeustureToLeft];
    }
    
}

//右边点击事件
- (void)tapRightDrawerButton
{
    _LeftDrawerVC.view.hidden = YES;
    
    _RightDrawerVC.view.hidden = NO;
    
    if (!self.IsRight) {
        
        _CenterDrawerVC.view.frame = CGRectMake(0, 0, 320, 568);
        
        _IsRight = YES;
        
        _RightDrawerIsShow = NO;
        
        [self AddTapGestureToRight];
        
    }else{
        
        _CenterDrawerVC.view.frame = CGRectMake(-250, 60, 320, 400);
        
        _RightDrawerIsShow = YES;
        
        _IsRight = NO;
        
        [self AddTapGestureToRight];
    }
}
#pragma 关闭左右抽屉的快捷方法
//关闭左抽屉,方便调用

- (void)closeLeftDrawer
{
    _CenterDrawerVC.view.frame = CGRectMake(0, 0, 320, 568);
    
    _IsLeft = YES;
    
    _LeftDrawerIsShow = NO;
    
    [self AddTapGestureToLeft];
    
}

//关闭右抽屉,方便调用

- (void)closeRightDrawer
{
    _CenterDrawerVC.view.frame = CGRectMake(0, 0, 320, 568);
    
    _IsRight = YES;
    
    _RightDrawerIsShow = NO;
    
    [self AddTapGestureToRight];
    
}

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end


类目的.h文件

#import <UIKit/UIKit.h>
#import "DrawerViewController.h"

@interface UIViewController (MyDrawer)

@property(nonatomic,strong,readonly)DrawerViewController *xukunDrawerViewController;

@end
类目的.m文件
@implementation UIViewController (MyDrawer)

-(DrawerViewController *)xukunDrawerViewController{
    
    if([self.parentViewController isKindOfClass:[DrawerViewController class]]){
        
        return (DrawerViewController*)self.parentViewController;
        
    }else if([self.parentViewController isKindOfClass:[UINavigationController class]] &&
            [self.parentViewController.parentViewController isKindOfClass:[DrawerViewController class]]){
        
        return (DrawerViewController*)[self.parentViewController parentViewController];
        
    }else{
        
        return nil;
    }
}
@end


原文地址:https://www.cnblogs.com/xukunhenwuliao/p/3576194.html