轮子太多,撸了个基础样式,大家自己想要什么效果可以自己继续改造一下...
效果如下:
个人一般追求
代码即注释
...不多做说明
#import <UIKit/UIKit.h>
@class TYNavigationDropdownMenuView;
@protocol TYNavigationDropdownMenuViewDelegate <NSObject>
@optional
- (void)ty_navigationDropdownMenuView:(TYNavigationDropdownMenuView *)view didSelectText:(NSString *)text;
@end
@interface TYNavigationDropdownMenuView : UIView
// 内容数组
@property (nonatomic, strong) NSArray<NSString *> *menuContextArray;
// 选项高度
@property (nonatomic, assign) CGFloat rowHeight;
// 是否已经显示
@property (nonatomic, assign) BOOL isShow;
@property (nonatomic, weak) id<TYNavigationDropdownMenuViewDelegate> delegate;
- (void)showInView:(UIView *)view;
- (void)dismiss;
@end
#import "TYNavigationDropdownMenuView.h"
@interface TYNavigationDropdownMenuView () <UITableViewDelegate,UITableViewDataSource>
@property (nonatomic, strong) UIView *backgroundView;
@property (nonatomic, strong) UITableView *containerTableView;
@end
@implementation TYNavigationDropdownMenuView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.menuContextArray = [NSArray array];
self.rowHeight = 30;
[self setupBaseView];
}
return self;
}
- (void)setupBaseView {
self.backgroundView = ({
UIView *backgroundView = [[UIView alloc] initWithFrame:self.bounds];
backgroundView.backgroundColor = [UIColor blackColor];
backgroundView.alpha = 0.f;
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgroundViewDidTapped:)];
[backgroundView addGestureRecognizer:tap];
[self addSubview:backgroundView];
backgroundView;
});
self.containerTableView = ({
UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 0) style:UITableViewStylePlain];
tableView.delegate = self;
tableView.dataSource = self;
tableView.rowHeight = _rowHeight;
tableView.showsVerticalScrollIndicator = NO;
tableView.scrollEnabled = NO;
[self addSubview:tableView];
tableView;
});
}
#pragma mark - Public Methods
- (void)showInView:(UIView *)view {
[view addSubview:self];
self.isShow = YES;
CGFloat height = _menuContextArray.count * _rowHeight;
// 默认,导航栏要是非透明的,这样 tableview 才可以藏到导航栏下面不被发现,这个时候 当前 view 的坐标(0,0)是从导航栏下面开始,而不是状态栏
self.containerTableView.frame = CGRectMake(0, -height, [UIScreen mainScreen].bounds.size.width, height);
[self.containerTableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
// 结束所有当前响应..比如弹出的键盘..
[view endEditing:YES];
CGFloat y = 0;
CGRect endFrame = self.containerTableView.frame;
endFrame.origin.y = y;
[UIView animateWithDuration:0.6
delay:0
usingSpringWithDamping:0.8
initialSpringVelocity:2
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
self.backgroundView.alpha = 0.2f;
self.containerTableView.frame = endFrame;
} completion:nil];
});
}
- (void)dismiss {
self.isShow = NO;
dispatch_async(dispatch_get_main_queue(), ^{
CGFloat y = - self.containerTableView.frame.size.height;
CGRect endFrame = self.containerTableView.frame;
endFrame.origin.y = y;
[UIView animateWithDuration:0.3
delay:0
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
self.backgroundView.alpha = 0.f;
self.containerTableView.frame = endFrame;
} completion:^(BOOL finished) {
[self removeFromSuperview];
}];
});
}
#pragma mark - UITableViewDataSource Methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _menuContextArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdent = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdent];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdent];
}
cell.textLabel.text = _menuContextArray[indexPath.row];
return cell;
}
#pragma mark - UITableViewDelegate Methods
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return _rowHeight;
}
- (void)tableView:(nonnull UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if ([_delegate respondsToSelector:@selector(ty_navigationDropdownMenuView:didSelectText:)]) {
[_delegate ty_navigationDropdownMenuView:self didSelectText:_menuContextArray[indexPath.row]];
}
[self dismiss];
}
#pragma mark - Action Events
- (void)backgroundViewDidTapped:(UITapGestureRecognizer *)gesture{
[self dismiss];
}
- (void)dealloc {
NSLog(@"%@-释放了",self.class);
}
@end
收工.....