效果图:

废话不多 直接上代码
.h
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface SheetViewController : UIViewController
+ (instancetype)new __attribute__((unavailable));
+ (instancetype)alloc __attribute__((unavailable));
- (instancetype)init __attribute__((unavailable));
+ (void)showSheetViewControllerWith:(NSArray<NSString *> *)items
selectItemCallBack:(void(^)(NSInteger index))selectCallBack
showController:(UIViewController *)controller;
@end
NS_ASSUME_NONNULL_END
.m
#import "SheetViewController.h"
#define width [UIScreen mainScreen].bounds.size.width
#define height [UIScreen mainScreen].bounds.size.height
#define cellHeight 50
#define cellFooterHeight 10
#define duration 0.3
typedef void(^SelectItemCallBack)(NSInteger index);
@interface SheetViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UIView *backgrundView; /**xib 上面的view 就是个遮罩*/
@property (strong, nonatomic)UIView *bottomView;
@property (nonatomic,strong) UITableView *tableView;
@property (nonatomic,strong) NSMutableArray<NSArray *> *dataArray;
@property (nonatomic,assign) CGFloat bottomViewHeight;
@property (nonatomic,copy) NSArray<NSString *> *items;
@property (nonatomic,copy) SelectItemCallBack selectItemCallBack;
@end
@implementation SheetViewController
+ (void)showSheetViewControllerWith:(NSArray<NSString *> *)items
selectItemCallBack:(void (^)(NSInteger))selectCallBack
showController:(UIViewController *)controller {
SheetViewController *sheetViewController = [[SheetViewController alloc] init];
sheetViewController.selectItemCallBack = selectCallBack;
sheetViewController.items = items;
sheetViewController.modalPresentationStyle = UIModalPresentationCustom;
sheetViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[controller presentViewController:sheetViewController animated:YES completion:nil];
}
- (NSMutableArray<NSArray *> *)dataArray {
if (_dataArray == nil) {
_dataArray = [NSMutableArray array];
}
return _dataArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.dataArray addObject:self.items];
[self.dataArray addObject:@[@"取消"]];
if ([self isIPhoneXAndLater]) {
self.bottomViewHeight = cellFooterHeight + cellHeight * (self.items.count + 1) + 34;
}else {
self.bottomViewHeight = cellFooterHeight + cellHeight * (self.items.count + 1);
}
[self setUpSubViews];
[self configController];
}
- (void)configController {
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchesBegan)];
[self.backgrundView addGestureRecognizer:tap];
}
- (void)touchesBegan {
[self dismiss];
}
- (void)setUpSubViews {
self.bottomView = [[UIView alloc] init];
self.bottomView.backgroundColor = [UIColor whiteColor];
self.bottomView.frame = CGRectMake(0, height, width, self.bottomViewHeight);
[self.view addSubview:self.bottomView];
[self shapeLayerWith:self.bottomView];
CGFloat tableViewHeight = [self isIPhoneXAndLater] ? self.bottomViewHeight - 34 : self.bottomViewHeight;
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, width, tableViewHeight)
style:UITableViewStylePlain];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.bounces = NO;
self.tableView.rowHeight = cellHeight;
[self.bottomView addSubview:self.tableView];
if ([self isIPhoneXAndLater]) {
UIView *tableViewBottomView = [[UIView alloc] initWithFrame:CGRectMake(0, tableViewHeight, width, 34)];
tableViewBottomView.backgroundColor = [UIColor whiteColor];
[self.bottomView addSubview:tableViewBottomView];
}
__weak typeof(self) weakSelf = self;
dispatch_time_t timer = dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC);
dispatch_after(timer, dispatch_get_main_queue(), ^(void){
[weakSelf show];
});
}
- (BOOL)isIPhoneXAndLater {
if (@available(iOS 11.0, *)) {
if ([[UIApplication sharedApplication] delegate].window.safeAreaInsets.bottom > 0.0){
return YES;
}else {
return NO;
}
} else {
// Fallback on earlier versions
return NO;
}
}
- (void)dismiss {
__weak typeof(self) weakSelf = self;
[UIView animateWithDuration:duration
animations:^{
weakSelf.bottomView.frame = CGRectMake(0, height, width, weakSelf.bottomViewHeight);
} completion:^(BOOL finished) {
[self dismissViewControllerAnimated:YES completion:nil];
}];
}
- (void)show {
__weak typeof(self) weakSelf = self;
[UIView animateWithDuration:duration
animations:^{
__block typeof(weakSelf) blokSelf = weakSelf;
blokSelf.bottomView.frame = CGRectMake(0, height - blokSelf.bottomViewHeight, width, blokSelf.bottomViewHeight);
[blokSelf.bottomView layoutIfNeeded];
} completion:nil];
}
- (void)shapeLayerWith:(UIView *)view {
UIBezierPath *maskPath =[UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(10,10)];
CAShapeLayer *maskLayer =[[CAShapeLayer alloc] init];
maskLayer.path = maskPath.CGPath;
view.layer.mask = maskLayer;
}
#pragma mark - UITableViewDelegate,UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.dataArray.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.dataArray[section].count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellName"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellName"];
}
cell.textLabel.text = self.dataArray[indexPath.section][indexPath.row];
cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
cell.textLabel.textAlignment = NSTextAlignmentCenter;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (self.selectItemCallBack) {
if (indexPath.section == 0) {
self.selectItemCallBack(indexPath.row);
}else {
self.selectItemCallBack(self.items.count);
}
}
[self dismiss];
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
if (section == 0) {
return 10;
}else {
return 0.01;
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 0.01;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
if (section == 0) {
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, 10)];
view.backgroundColor = [UIColor colorWithRed:225/255.f green:225/255.f blue:225/255.f alpha:1.f];
return view;
}else {
return [[UIView alloc] initWithFrame:CGRectZero];
}
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
使用方法
[SheetViewController showSheetViewControllerWith:@[@"1111",@"2222",@"3333",@"4444",@"5555",@"6666"]
selectItemCallBack:^(NSInteger index) {
NSLog(@"%ld",index);
} showController:self];
网友评论