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 初始化側(cè)滑控制器
@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];//界面可視區(qū)展現(xiàn)
//蒙版
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];
//獲取左側(cè)tableview????????
for (UIView *obj in self.leftVC.view.subviews) {
if ([obj isKindOfClass:[UITableView class]]) {
self.leftTableview = (UITableView *)obj;
}
}
//獲取右側(cè)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);
//設(shè)置左側(cè)tableview的初始位置和縮放系數(shù)
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);
//設(shè)置右側(cè)tableview的初始位置和縮放系數(shù)
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;//初始時側(cè)滑窗關(guān)閉
}
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;
}
//根據(jù)視圖位置判斷是左滑還是右邊滑動
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;
}
}
//手勢結(jié)束后修正位置,超過約一半時向多出的一半偏移
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 關(guān)閉左視圖
*/
- (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 關(guān)閉右視圖
*/
- (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];
//*************************界面展現(xiàn)布局效果****************************************************
self.centerVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,kLeftMainPageScale,kLeftMainPageScale);
self.centerVC.view.center = kLeftBarButtonItemMainPageCenter;
//*************************界面展現(xiàn)布局效果****************************************************
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];
//*************************界面展現(xiàn)布局效果****************************************************
self.centerVC.view.transform = CGAffineTransformScale(CGAffineTransformIdentity,kRightMainPageScale,kLeftMainPageScale);
self.centerVC.view.center =kRightBarButtonItemMainPageCenter;
//*************************界面展現(xiàn)布局效果****************************************************
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;? //點擊事件蓋住其它響應(yīng)事件,但蓋不住Button;
}
}
//關(guān)閉行為收斂
- (void) removeSingleTap
{
for (UIButton *tempButton in [self.centerVC.view? subviews])
{
[tempButton setUserInteractionEnabled:YES];
}
[self.centerVC.view removeGestureRecognizer:self.sideslipTapGes];
self.sideslipTapGes = nil;
}
/**
*? 設(shè)置滑動開關(guān)是否開啟
*
*? @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(@"不響應(yīng)側(cè)滑");
return NO;
}
else
{
//? ? ? ? NSLog(@"響應(yīng)側(cè)滑");
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