美文网首页
iOS 仿微信 AlertSheet

iOS 仿微信 AlertSheet

作者: 陈先生的干货店 | 来源:发表于2020-01-15 15:09 被阅读0次

效果图:


image.png

废话不多 直接上代码
.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];

相关文章

网友评论

      本文标题:iOS 仿微信 AlertSheet

      本文链接:https://www.haomeiwen.com/subject/duutzctx.html