這幾天閑著沒事,看了幾個抽屜效果,總覺得大都寫的有些複雜,便自己封裝了一個.主要為了自己專案服務,主要按照網易用戶端的樣式封裝,未提供更改中間視圖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