日常使用App過程中經(jīng)乘痪樱看到下拉菜單的使用绵咱。例如:
阿里郵箱客戶端頂部:
網(wǎng)易郵箱大師客戶端頂部:
企鵝群:
對(duì)此做了以下實(shí)現(xiàn)方案的思考贝奇。
1、給navigationBar添加一個(gè)可以展開的視圖悼凑。
2芜辕、給viewController添加一個(gè)可以下拉展開的視圖浙巫。
1雇逞、給navigationBar添加一個(gè)可以展開的視圖。
git:https://github.com/KKLater/UINavigationBar-LATNavigationSpreadViewCategory
1.1演示
1.2使用
//直接設(shè)置navigationBar的spreadView屬性珠移,來設(shè)置展開視圖
self.navigationController.navigationBar.spreadView = self.navigationSpreadView;
//可以用過navigationBar的isSpreadViewShow屬性判定視圖是否處于展開的狀態(tài)
if (self.navigationController.navigationBar.isSpreadViewShow) {
//隱藏視圖
[self.navigationController.navigationBar hideSpreadView];
} else {
//展開視圖
[self.navigationController.navigationBar showSpreadView];
}
2弓乙、給viewController添加一個(gè)可以下拉展開的視圖。
Git:https://github.com/KKLater/UIViewController-LATSpreadViewCategory
2.1演示
2.1.1 普通用法
2.2.2 自定義背景視圖钧惧、
2.2使用
2.2.1顯示
直接調(diào)用顯示方法
/**
* spreadView顯示
*
* @param animation 顯示過程block
* @param completed 顯示結(jié)束block
*/
- (void)showSpreadViewAnimation:(void(^)())animation completed:(void(^)())completed;
可以通過設(shè)置animation來執(zhí)行顯示過程中的動(dòng)畫暇韧,設(shè)置completed來設(shè)置顯示結(jié)束的動(dòng)畫。例如:
__weak typeof(self)weakSelf = self;
[self showSpreadViewAnimation:^{
weakSelf.titleButton.selected = !weakSelf.isSpreadViewShow;
} completed:^{
NSLog(@"isShow");
}];
2.2.2 隱藏
直接調(diào)用隱藏方法
/**
* spreadView隱藏
*
* @param animation 隱藏過程block
* @param completed 隱藏結(jié)束block
*/
- (void)hideSpreadViewAnimation:(void(^)())animation completed:(void(^)())completed;
可以通過設(shè)置animation來執(zhí)行消失過程中的動(dòng)畫浓瞪,設(shè)置completed來設(shè)置視圖隱藏結(jié)束的動(dòng)畫。例如:
__weak typeof(self)weakSelf = self;
[self hideSpreadViewAnimation:^{
weakSelf.titleButton.selected = !weakSelf.isSpreadViewShow;
} completed:^{
NSLog(@"isHide");
}];
注意:過程中的animation和結(jié)束的completed與category內(nèi)的代碼是相互獨(dú)立的乾颁。
2.2.3 獲取當(dāng)前狀態(tài)(顯示或者隱藏)
通過
/**
* 視圖是否處于展開的狀態(tài)
*/
@property (assign, nonatomic, readonly) BOOL isSpreadViewShow;
屬性可以獲取當(dāng)前展示狀態(tài)涂乌。
2.2.4 設(shè)置spreadView
直接設(shè)置屬性@property (strong, nonatomic) UIView *spreadView;來設(shè)置spreadView艺栈。在設(shè)置屬性前,需要將spreadView的各種屬性設(shè)置完成骂倘。例如frame眼滤。
self.navigationSpreadView.frame = CGRectMake(0, 64, CGRectGetWidth(self.view.frame), 100);
self.spreadView = self.navigationSpreadView;
2.2.5 自定義backView
已經(jīng)默認(rèn)封裝的backView是一個(gè)黑色巴席,alpha為0.3的視圖历涝。未添加點(diǎn)擊消失的手勢(shì)。
不單獨(dú)設(shè)置backView漾唉,可使用已經(jīng)封裝的backView荧库,不需要做任何處理。
如果需要設(shè)置特殊的backView赵刑,可以設(shè)置@property (strong, nonatomic) UIView *spreadBackView;屬性來設(shè)置分衫。同樣也可以給spreadBackView添加手勢(shì)。例如:
//自定義背景圖
UIView *back = [[UIView alloc] initWithFrame:self.view.bounds];
back.backgroundColor = [UIColor redColor];
self.spreadBackView = back;
//給背景視圖添加手勢(shì)
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
[self.spreadBackView addGestureRecognizer:tapGesture];
手勢(shì)對(duì)應(yīng)調(diào)用隱藏方法即可般此。
__weak typeof(self)weakSelf = self;
[self hideSpreadViewAnimation:^{
weakSelf.titleButton.selected = !weakSelf.isSpreadViewShow;
} completed:^{
NSLog(@"isShow");
}];
期望:暫時(shí)只是添加了spreadView功能蚪战。并未設(shè)置出現(xiàn)的方向。后期期望添加展開視圖的出現(xiàn)方向铐懊。