四種常用風格的抽屜視圖

1)雙向抽屜視圖

2)抽屜動畫

3)雙向抽屜視圖帶縮放效果

4)抽屜視圖動畫縮放

#import "ApDrawerController.h"#import "AppDelegate.h"#import "leftVC.h"#import "rightVC.h"@interface ApDrawerController (){

CGFloat _scalef;? //實時橫向位移

}

@property (nonatomic,strong) UITableView *leftTableview;

@property (nonatomic,assign) CGFloat leftTableviewW;

@property (nonatomic,strong) UIView *contentView;

@property (nonatomic,strong) UITableView *rightTableview;

@end

@implementation ApDrawerController

- (void)viewDidLoad {

[super viewDidLoad];

//? ? [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(judge) name:UIWindowDidBecomeHiddenNotification object:nil];

}

//-(void)judge{

//? ? self.rightVC.view.hidden=YES;

//? ? self.leftVC.view.hidden=NO;

//}

/**

@brief 初始化側滑控制器

@param leftVC 左視圖控制器

@param rightVC 右視圖控制器

centerVC 中間視圖控制器

@result instancetype 初始化生成的對象

*/

- (instancetype)initWithCenterViewController:(UIViewController *)centerVC leftViewController:(UIViewController *)leftVC RightViewController:(UIViewController *)rightVC{

self = [super init];

if(self){

self.speedf = vSpeedFloat;

self.leftVC = leftVC;

self.centerVC = centerVC;

self.rightVC=rightVC;

//滑動手勢

self.pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePan:)];

[self.centerVC.view addGestureRecognizer:self.pan];

[self.pan setCancelsTouchesInView:YES];

self.pan.delegate = self;

self.leftVC.view.hidden = YES;

self.rightVC.view.hidden=YES;

[self addChildViewController:leftVC];

[self.view addSubview:self.leftVC.view];

[self addChildViewController:rightVC];//確定界面切換方式

[self.view addSubview:self.rightVC.view];//界面可視區展現

//蒙版

UIView* viewl = [[UIView alloc] init];

viewl.frame = self.leftVC.view.bounds;

viewl.backgroundColor = [UIColor blackColor];

viewl.alpha = 0.5;

self.contentView = viewl;

[self.leftVC.view addSubview:viewl];

//蒙版

UIView *viewr = [[UIView alloc] init];

viewr.frame = self.rightVC.view.bounds;

viewr.backgroundColor = [UIColor blackColor];

viewr.alpha = 0.5;

self.contentView = viewr;

[self.leftVC.view addSubview:viewr];

//獲取左側tableview????????

for (UIView *obj in self.leftVC.view.subviews) {

if ([obj isKindOfClass:[UITableView class]]) {

self.leftTableview = (UITableView *)obj;

}

}

//獲取右側tableview????????

for (UIView *obj in self.rightVC.view.subviews) {

if ([obj isKindOfClass:[UITableView class]]) {

self.rightTableview = (UITableView *)obj;

}

}

self.leftTableview.backgroundColor = [UIColor clearColor];

self.leftTableview.frame = CGRectMake(0, 0, kScreenWidth - kMainPageDistance, kScreenHeight);

//設置左側tableview的初始位置和縮放系數

self.leftTableview.transform = CGAffineTransformMakeScale(kLeftScale, kLeftScale);

self.leftTableview.center = CGPointMake(kLeftCenterX, kScreenHeight * 0.5);

self.rightTableview.backgroundColor = [UIColor clearColor];

self.rightTableview.frame = CGRectMake(0, 0, kScreenWidth - kMainPageDistance, kScreenHeight);

//設置右側tableview的初始位置和縮放系數

self.rightTableview.transform = CGAffineTransformMakeScale(kLeftScale, kLeftScale);

self.rightTableview.center = CGPointMake(kLeftCenterX, kScreenHeight * 0.5);

//? ? ? ? [self.view addSubview:self.centerVC.view];

[self addChildViewController:self.centerVC];

[self.view addSubview:self.centerVC.view];

self.closed = YES;//初始時側滑窗關閉

}

return self;

}

- (void) viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

self.leftVC.view.hidden = NO;

}

#pragma mark - 滑動手勢

//滑動手勢

- (void) handlePan: (UIPanGestureRecognizer *)rec{

CGPoint point = [rec translationInView:self.view];

_scalef = (point.x * self.speedf + _scalef);

BOOL needMoveWithTap = YES;? //是否還需要跟隨手指移動

if (((self.centerVC.view.frame.origin.x <= 0) && (_scalef <= 0)) || ((self.centerVC.view.frame.origin.x >= (kScreenWidth - kMainPageDistance )) && (_scalef >= 0)))

{

//邊界值管控

_scalef = 0;

needMoveWithTap = NO;

}

//根據視圖位置判斷是左滑還是右邊滑動

if (needMoveWithTap && (rec.view.frame.origin.x >= 0) && (rec.view.frame.origin.x <= (kScreenWidth - kMainPageDistance)))

{

CGFloat recCenterX = rec.view.center.x + point.x * self.speedf;

if (recCenterX < kScreenWidth * 0.5 - 2) {

recCenterX = kScreenWidth * 0.5;

}

CGFloat recCenterY = rec.view.center.y;

rec.view.center = CGPointMake(recCenterX,recCenterY);

//scale 1.0~kMainPageScale

CGFloat scale = 1 - (1 - kLeftMainPageScale) * (rec.view.frame.origin.x / (kScreenWidth - kMainPageDistance));

rec.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,scale, scale);

[rec setTranslation:CGPointMake(0, 0) inView:self.view];

CGFloat leftTabCenterX = kLeftCenterX + ((kScreenWidth - kMainPageDistance) * 0.5 - kLeftCenterX) * (rec.view.frame.origin.x / (kScreenWidth - kMainPageDistance));

//? ? ? ? NSLog(@"%f",leftTabCenterX);

//leftScale kLeftScale~1.0

CGFloat leftScale = kLeftScale + (1 - kLeftScale) * (rec.view.frame.origin.x / (kScreenWidth - kMainPageDistance));

self.leftTableview.center = CGPointMake(leftTabCenterX, kScreenHeight * 0.5);

self.leftTableview.transform = CGAffineTransformScale(CGAffineTransformIdentity, leftScale,leftScale);

//tempAlpha kLeftAlpha~0

CGFloat tempAlpha = kLeftAlpha - kLeftAlpha * (rec.view.frame.origin.x / (kScreenWidth - kMainPageDistance));

self.contentView.alpha = tempAlpha;

}

else

{//**********************************手勢范圍************************************************

//超出范圍,

if (self.centerVC.view.frame.origin.x < 0)

{

[self closeLeftView];

_scalef = 0;

}else if (self.centerVC.view.frame.origin.x >0&&self.centerVC.view.frame.origin.x<(kScreenWidth - kMainPageDistance)){

//? ? ? ? ? ? self.rightVC.view.hidden=YES;

//? ? ? ? ? ? self.leftVC.view.hidden=NO;

//

}else if (self.centerVC.view.frame.origin.x > (kScreenWidth - kMainPageDistance)){

[self openLeftView];//self.centerVC.view仿射變換

_scalef = 0;

}

}

//手勢結束后修正位置,超過約一半時向多出的一半偏移

if (rec.state == UIGestureRecognizerStateEnded) {

if (fabs(_scalef) > vCouldChangeDeckStateDistance)

{

if (self.closed)

{

[self openLeftView];

}

else

{

[self closeLeftView];

}

}

else

{

if (self.closed)

{

[self closeLeftView];

}

else

{

[self openLeftView];

}

}

_scalef = 0;

}

}

#pragma mark - 單擊手勢

-(void)handeTap:(UITapGestureRecognizer *)tap{

if ((!self.closed) && (tap.state == UIGestureRecognizerStateEnded))

{

[UIView beginAnimations:nil context:nil];

tap.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);

tap.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2,[UIScreen mainScreen].bounds.size.height/2);

self.closed = YES;

self.leftTableview.center = CGPointMake(kLeftCenterX, kScreenHeight * 0.5);

self.leftTableview.transform = CGAffineTransformScale(CGAffineTransformIdentity,kLeftScale,kLeftScale);

self.contentView.alpha = kLeftAlpha;

[UIView commitAnimations];

_scalef = 0;

[self removeSingleTap];

}

}

#pragma mark - 修改視圖位置

/**

@brief 關閉左視圖

*/

- (void)closeLeftView

{

[UIView beginAnimations:nil context:nil];

self.centerVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);

self.centerVC.view.center = CGPointMake(kScreenWidth / 2, kScreenHeight / 2);

self.closed = YES;

self.leftTableview.center = CGPointMake(kLeftCenterX, kScreenHeight * 0.5);

self.leftTableview.transform = CGAffineTransformScale(CGAffineTransformIdentity,kLeftScale,kLeftScale);

self.contentView.alpha = kLeftAlpha;

[UIView commitAnimations];

[self removeSingleTap];

}

/**

@brief 關閉右視圖

*/

- (void)closeRightView

{

[UIView beginAnimations:nil context:nil];

self.centerVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);

self.centerVC.view.center = CGPointMake(kScreenWidth / 2, kScreenHeight / 2);

self.closed = YES;

self.rightTableview.center = CGPointMake(kLeftCenterX, kScreenHeight * 0.5);

self.rightTableview.transform = CGAffineTransformScale(CGAffineTransformIdentity,kLeftScale,kLeftScale);

self.contentView.alpha = kLeftAlpha;

[UIView commitAnimations];

[self removeSingleTap];

}

/**

@brief 打開左視圖

*/

- (void)openLeftView

{

[UIView beginAnimations:nil context:nil];

//*************************界面展現布局效果****************************************************

self.centerVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,kLeftMainPageScale,kLeftMainPageScale);

self.centerVC.view.center = kLeftBarButtonItemMainPageCenter;

//*************************界面展現布局效果****************************************************

self.closed = NO;

self.leftTableview.center = CGPointMake((kScreenWidth - kMainPageDistance) * 0.5, kScreenHeight * 0.5);

self.leftTableview.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);

self.contentView.alpha = 0;

self.rightVC.view.hidden=YES;

self.leftVC.view.hidden=NO;

[(leftVC*)self.leftVC setCATransitionWithMainType:CameraIrisHollowOpen SubType:CATransitionFromRight];

[UIView commitAnimations];

[self disableTapButton];

}

/**

@brief 打開右視圖

*/

- (void)openRightView

{

[UIView beginAnimations:nil context:nil];

//*************************界面展現布局效果****************************************************

self.centerVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,kRightMainPageScale,kLeftMainPageScale);

self.centerVC.view.center =kRightBarButtonItemMainPageCenter;

//*************************界面展現布局效果****************************************************

self.closed = NO;

self.rightTableview.center = CGPointMake((kScreenWidth - kMainPageDistance) * 0.5, kScreenHeight * 0.5);

self.rightTableview.transform = CGAffineTransformScale(CGAffineTransformIdentity,1.0,1.0);

self.contentView.alpha = 0;

self.rightVC.view.hidden=NO;

self.leftVC.view.hidden=YES;

[(rightVC*)self.rightVC setCATransitionWithMainType:OglFlip SubType:CATransitionFromRight];

[UIView commitAnimations];

[self disableTapButton];

}

#pragma mark - 行為收斂控制

- (void)disableTapButton

{

for (UIButton *tempButton in [_centerVC.view subviews])

{

[tempButton setUserInteractionEnabled:NO];

}

//單擊

if (!self.sideslipTapGes)

{

//單擊手勢

self.sideslipTapGes= [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handeTap:)];

[self.sideslipTapGes setNumberOfTapsRequired:1];

[self.centerVC.view addGestureRecognizer:self.sideslipTapGes];

self.sideslipTapGes.cancelsTouchesInView = YES;? //點擊事件蓋住其它響應事件,但蓋不住Button;

}

}

//關閉行為收斂

- (void) removeSingleTap

{

for (UIButton *tempButton in [self.centerVC.view? subviews])

{

[tempButton setUserInteractionEnabled:YES];

}

[self.centerVC.view removeGestureRecognizer:self.sideslipTapGes];

self.sideslipTapGes = nil;

}

/**

*? 設置滑動開關是否開啟

*

*? @param enabled YES:支持滑動手勢,NO:不支持滑動手勢

*/

- (void)setPanEnabled: (BOOL) enabled

{

[self.pan setEnabled:enabled];

}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{

return YES;

}

- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch {

if(self.beginSlide != nil)

{

self.beginSlide();

}

if(touch.view.tag == vDeckCanNotPanViewTag)

{

//? ? ? ? NSLog(@"不響應側滑");

return NO;

}

else

{

//? ? ? ? NSLog(@"響應側滑");

return YES;

}

}

@end

@implementation UIViewController (ApDrawerController)

- (ApDrawerController *)apDrawerCtrl

{

if([self.parentViewController isKindOfClass:[ApDrawerController class]]){

return (ApDrawerController*)self.parentViewController;

}

else if([self.parentViewController isKindOfClass:[UINavigationController class]] &&

[self.parentViewController.parentViewController isKindOfClass:[ApDrawerController class]]){

return (ApDrawerController *)self.parentViewController.parentViewController;

}

else{

return nil;

}

}

@end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容