日常使用App過程中經常看到下拉菜單的使用。例如:
阿里郵箱客戶端頂部:
網易郵箱大師客戶端頂部:
企鵝群:
對此做了以下實現方案的思考。
1、給navigationBar添加一個可以展開的視圖。
2、給viewController添加一個可以下拉展開的視圖。
1、給navigationBar添加一個可以展開的視圖。
git:https://github.com/KKLater/UINavigationBar-LATNavigationSpreadViewCategory
1.1演示
1.2使用
//直接設置navigationBar的spreadView屬性,來設置展開視圖
self.navigationController.navigationBar.spreadView = self.navigationSpreadView;
//可以用過navigationBar的isSpreadViewShow屬性判定視圖是否處于展開的狀態
if (self.navigationController.navigationBar.isSpreadViewShow) {
//隱藏視圖
[self.navigationController.navigationBar hideSpreadView];
} else {
//展開視圖
[self.navigationController.navigationBar showSpreadView];
}
2、給viewController添加一個可以下拉展開的視圖。
Git:https://github.com/KKLater/UIViewController-LATSpreadViewCategory
2.1演示
2.1.1 普通用法
2.2.2 自定義背景視圖、
2.2使用
2.2.1顯示
直接調用顯示方法
/**
* spreadView顯示
*
* @param animation 顯示過程block
* @param completed 顯示結束block
*/
- (void)showSpreadViewAnimation:(void(^)())animation completed:(void(^)())completed;
可以通過設置animation來執行顯示過程中的動畫,設置completed來設置顯示結束的動畫。例如:
__weak typeof(self)weakSelf = self;
[self showSpreadViewAnimation:^{
weakSelf.titleButton.selected = !weakSelf.isSpreadViewShow;
} completed:^{
NSLog(@"isShow");
}];
2.2.2 隱藏
直接調用隱藏方法
/**
* spreadView隱藏
*
* @param animation 隱藏過程block
* @param completed 隱藏結束block
*/
- (void)hideSpreadViewAnimation:(void(^)())animation completed:(void(^)())completed;
可以通過設置animation來執行消失過程中的動畫,設置completed來設置視圖隱藏結束的動畫。例如:
__weak typeof(self)weakSelf = self;
[self hideSpreadViewAnimation:^{
weakSelf.titleButton.selected = !weakSelf.isSpreadViewShow;
} completed:^{
NSLog(@"isHide");
}];
注意:過程中的animation和結束的completed與category內的代碼是相互獨立的。
2.2.3 獲取當前狀態(顯示或者隱藏)
通過
/**
* 視圖是否處于展開的狀態
*/
@property (assign, nonatomic, readonly) BOOL isSpreadViewShow;
屬性可以獲取當前展示狀態。
2.2.4 設置spreadView
直接設置屬性@property (strong, nonatomic) UIView *spreadView;來設置spreadView。在設置屬性前,需要將spreadView的各種屬性設置完成。例如frame。
self.navigationSpreadView.frame = CGRectMake(0, 64, CGRectGetWidth(self.view.frame), 100);
self.spreadView = self.navigationSpreadView;
2.2.5 自定義backView
已經默認封裝的backView是一個黑色,alpha為0.3的視圖。未添加點擊消失的手勢。
不單獨設置backView,可使用已經封裝的backView,不需要做任何處理。
如果需要設置特殊的backView,可以設置@property (strong, nonatomic) UIView *spreadBackView;屬性來設置。同樣也可以給spreadBackView添加手勢。例如:
//自定義背景圖
UIView *back = [[UIView alloc] initWithFrame:self.view.bounds];
back.backgroundColor = [UIColor redColor];
self.spreadBackView = back;
//給背景視圖添加手勢
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap)];
[self.spreadBackView addGestureRecognizer:tapGesture];
手勢對應調用隱藏方法即可。
__weak typeof(self)weakSelf = self;
[self hideSpreadViewAnimation:^{
weakSelf.titleButton.selected = !weakSelf.isSpreadViewShow;
} completed:^{
NSLog(@"isShow");
}];
期望:暫時只是添加了spreadView功能。并未設置出現的方向。后期期望添加展開視圖的出現方向。