項(xiàng)目中根據(jù)需求用到了一個(gè)界面框架:ViewDeck漩怎。項(xiàng)目需要用到左側(cè)右側(cè)各有一個(gè)抽屜視圖勋颖,而這個(gè)類庫可以極其簡(jiǎn)單的實(shí)現(xiàn)這個(gè)功能,不單單是左右各一個(gè)勋锤,它可以隨意設(shè)置上下左右的抽屜視圖饭玲,簡(jiǎn)直是360度想怎么抽怎么抽,這里記錄一下使用方法叁执。
先看一下效果圖:
首先是主視圖茄厘,也就是中間的視圖:
上方是Navbar,左邊有一個(gè)按鈕用來開啟左邊視圖谈宛,當(dāng)然左右視圖都是可以通過左右滑動(dòng)來開啟的次哈,中間的Label顯示這是哪里的界面,左側(cè)有個(gè)Button用來測(cè)試中間界面是否可以點(diǎn)擊入挣,這些都先不管亿乳。
再看左側(cè)界面出現(xiàn)的樣子:
可以看到,左邊界面會(huì)出現(xiàn)并占據(jù)左邊的部分界面径筏,同時(shí)保留原中間視圖的一部分葛假,另一部分被擠出去了,當(dāng)然左邊界面也沒有顯示完全滋恬。
再看把右邊視圖滑出來時(shí)也是一樣:
現(xiàn)在看看怎么實(shí)現(xiàn)聊训,同時(shí)也說說ViewDeck常用的方法。
ViewDeck只是一個(gè)框架恢氯,具體的界面當(dāng)然還是自己自定義的带斑,因此這里先自定義三個(gè)視圖控制器用來放在中間鼓寺、左邊和右邊的視圖中,然后就可以用這三個(gè)視圖來初始化ViewDeck并將其作為根視圖:
//.h文件
@property (strong, nonatomic) IIViewDeckController *deckController;
//.m文件
//中間視圖
CenterViewController *centerView = [[CenterViewController alloc] initWithNibName:@"CenterViewController" bundle:nil];
//左勋磕、右視圖
LeftViewController *leftView = [[LeftViewController alloc] initWithNibName:@"LeftViewController" bundle:nil];
RightViewController *rightView = [[RightViewController alloc] initWithNibName:@"RightViewController" bundle:nil];
//初始化ViewDeck
self.deckController = [[IIViewDeckController alloc]initWithCenterViewController:centerView leftViewController:leftView rightViewController:rightView];
//設(shè)為根視圖
self.window.rootViewController = self.deckController;
這樣就是一個(gè)最簡(jiǎn)單的ViewDeck了妈候,擁有左右抽屜,可以滑動(dòng)出現(xiàn)挂滓,再滑回到中間視圖苦银。
如果除了滑動(dòng)還想實(shí)現(xiàn)按鈕來喚出左右視圖呢?就像QQ赶站、知乎之類的效果一樣幔虏,也很簡(jiǎn)單,為了方便贝椿,這里我們將中間視圖包裝成Nav導(dǎo)航視圖想括,然后以換出左視圖為例,在導(dǎo)航欄上左側(cè)添加一個(gè)按鈕烙博,在按鈕響應(yīng)中實(shí)現(xiàn)喚出左側(cè)視圖:
//.h文件
@property (strong, nonatomic) IIViewDeckController *deckController;
//.m文件
//中間視圖
CenterViewController *centerView = [[CenterViewController alloc] initWithNibName:@"CenterViewController" bundle:nil];
//包裝成Nav
UINavigationController *centerNav = [[UINavigationController alloc]initWithRootViewController:centerView];
//添加Nav左側(cè)按鈕
centerView.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"左側(cè)" style:UIBarButtonItemStyleDone target:self action:@selector(toLeft)];
//左瑟蜈、右視圖
LeftViewController *leftView = [[LeftViewController alloc] initWithNibName:@"LeftViewController" bundle:nil];
RightViewController *rightView = [[RightViewController alloc] initWithNibName:@"RightViewController" bundle:nil];
//初始化ViewDeck,以Nav作為中間視圖
self.deckController = [[IIViewDeckController alloc]initWithCenterViewController:centerNav leftViewController:leftView rightViewController:rightView];
//設(shè)為根視圖
self.window.rootViewController = self.deckController;
//中間導(dǎo)航欄左側(cè)按鈕的響應(yīng)
- (void)toLeft {
//直接打開左側(cè)頁面
[self.deckController toggleLeftViewAnimated:YES];
}
當(dāng)然如果要喚出右側(cè)界面也是類似的渣窜,這里按鈕可以打開踪栋,如果想要按鈕可以返回中間界面呢?更改按鈕響應(yīng)方法如下:
//中間導(dǎo)航欄左側(cè)按鈕的響應(yīng)
- (void)toLeft {
//判斷是否打開图毕,做出不同響應(yīng)
if ([self.deckController isSideOpen:IIViewDeckLeftSide]) {//已經(jīng)打開
[self.deckController closeLeftView];//則關(guān)閉左視圖
}
else {//未打開
[self.deckController openLeftView];//則打開左視圖
}
}
應(yīng)用到右視圖也是類似,其實(shí)這里的判斷是否打開以及打開左右視圖的方法很多地方都可以實(shí)用眷唉,發(fā)動(dòng)腦洞吧予颤。
現(xiàn)在可以通過滑動(dòng)開啟、關(guān)閉左右視圖冬阳,那還有沒有別的方法呢蛤虐?可不可以在打開左右視圖后,隨便點(diǎn)擊一下中間視圖部分就可以回來呢肝陪?這是很常見的用戶習(xí)慣驳庭。還有,既然上面實(shí)現(xiàn)了再次點(diǎn)擊按鈕返回中間界面氯窍,說明中間界面的控件是可以響應(yīng)的饲常,那用戶不小心點(diǎn)擊到了不該點(diǎn)的怎么辦,可不可以在打開左右視圖后狼讨,禁止中間界面控件的響應(yīng)呢贝淤?當(dāng)然是可以的。對(duì)ViewDeck控制器設(shè)置一個(gè)值就可以了:
//設(shè)置當(dāng)滑動(dòng)到左右邊時(shí)政供,中間視圖對(duì)點(diǎn)擊的響應(yīng)
//1.默認(rèn)設(shè)置播聪,點(diǎn)擊中間界面不會(huì)返回中間界面朽基,中間界面控件有響應(yīng)
// self.deckController.centerhiddenInteractivity = IIViewDeckCenterHiddenUserInteractive;
//2.點(diǎn)擊中間界面任何地方無作用,中間界面控件不響應(yīng)
// self.deckController.centerhiddenInteractivity = IIViewDeckCenterHiddenNotUserInteractive;
//3.點(diǎn)擊中間任何地方可返回中間界面离陶,中間界面控件不響應(yīng)
self.deckController.centerhiddenInteractivity = IIViewDeckCenterHiddenNotUserInteractiveWithTapToClose;
//4.點(diǎn)擊中間界面任何地方可彈回中間界面稼虎,中間界面控件不響應(yīng)
// self.deckController.centerhiddenInteractivity = IIViewDeckCenterHiddenNotUserInteractiveWithTapToCloseBouncing;
這里對(duì)這個(gè)值有四種設(shè)定方式,分別對(duì)應(yīng)了不同的效果招刨,我覺得最常用的還是第三種霎俩,也就是上面說的,禁止對(duì)控件響應(yīng)计济,并且隨意點(diǎn)擊返回中間界面茸苇。圖中的那個(gè)Button就是為了測(cè)試是否對(duì)點(diǎn)擊事件進(jìn)行響應(yīng)而設(shè)置的。
好像還漏了一個(gè)事情沦寂,從上面的圖可以看出学密,左邊和右邊視圖出現(xiàn)時(shí)占據(jù)屏幕的寬度是不一樣的,在實(shí)際的項(xiàng)目中传藏,往往也是根據(jù)需要占據(jù)不同的寬度腻暮,那么怎么設(shè)置呢?如下:
//設(shè)置左邊視圖顯示時(shí)的寬度
self.deckController.leftSize = self.window.frame.size.width - (250);
對(duì)右側(cè)的設(shè)置也是一樣毯侦。
基本常用的方法就這些了哭靖,不得不說這是一個(gè)異常簡(jiǎn)單但特別實(shí)用的類庫,感謝創(chuàng)作者侈离,github項(xiàng)目原地址為:https://github.com/Inferis/ViewDeck
可以到github下載我的工程:https://github.com/Cloudox/ViewDeckTest