四種常用風(fēng)格的抽屜視圖

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榕茧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖怪得,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卑硫,居然都是意外死亡徒恋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門欢伏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來入挣,“玉大人,你說我怎么就攤上這事硝拧【斗ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵障陶,是天一觀的道長滋恬。 經(jīng)常有香客問我,道長抱究,這世上最難降的妖魔是什么恢氯? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鼓寺,結(jié)果婚禮上勋拟,老公的妹妹穿的比我還像新娘。我一直安慰自己妈候,他們只是感情好敢靡,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著苦银,像睡著了一般啸胧。 火紅的嫁衣襯著肌膚如雪赶站。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天吓揪,我揣著相機與錄音亲怠,去河邊找鬼。 笑死柠辞,一個胖子當(dāng)著我的面吹牛团秽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叭首,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼习勤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焙格?” 一聲冷哼從身側(cè)響起图毕,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眷唉,沒想到半個月后予颤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡冬阳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年蛤虐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肝陪。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡驳庭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氯窍,到底是詐尸還是另有隱情饲常,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布狼讨,位于F島的核電站贝淤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏政供。R本人自食惡果不足惜播聪,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲫骗。 院中可真熱鬧犬耻,春花似錦踩晶、人聲如沸执泰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽术吝。三九已至计济,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間排苍,已是汗流浹背沦寂。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淘衙,地道東北人传藏。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像彤守,于是被迫代替她去往敵國和親毯侦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Core Animation其實是一個令人誤解的命名具垫。你可能認(rèn)為它只是用來做動畫的侈离,但實際上它是從一個叫做Laye...
    小貓仔閱讀 3,708評論 1 4
  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計數(shù)+1筝蚕,想要解決就用__block...
    炙冰閱讀 2,486評論 1 14
  • Transform field value key paths! position.x position.y 1....
    youngZhou閱讀 338評論 0 1
  • 1.NSString過濾特殊字符串定義一個特殊字符的集合NSCharacterSet set = [NSChara...
    奮拓達閱讀 726評論 0 0
  • Markdown 是一種輕量級的「標(biāo)記語言」卦碾,它的優(yōu)點很多,目前也被越來越多的寫作愛好者起宽,撰稿者廣泛使用洲胖。看到這里...
    SunStart閱讀 345評論 0 0