123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- //
- // YBIBSheetView.m
- // YBImageBrowserDemo
- //
- // Created by 波儿菜 on 2019/7/6.
- // Copyright © 2019 杨波. All rights reserved.
- //
- #import "YBIBSheetView.h"
- #import "YBIBUtilities.h"
- #import "YBIBCopywriter.h"
- @implementation YBIBSheetAction
- + (instancetype)actionWithName:(NSString *)name action:(YBIBSheetActionBlock)action {
- YBIBSheetAction *sheetAction = [YBIBSheetAction new];
- sheetAction.name = name;
- sheetAction.action = action;
- return sheetAction;
- }
- @end
- @interface YBIBSheetCell : UITableViewCell
- @property (nonatomic, strong) UILabel *titleLabel;
- @property (nonatomic, strong) CALayer *line;
- @end
- @implementation YBIBSheetCell
- - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
- if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
- self.selectionStyle = UITableViewCellSelectionStyleNone;
- _titleLabel = [UILabel new];
- _titleLabel.textColor = UIColor.darkTextColor;
- _titleLabel.font = [UIFont fontWithName:@"Avenir-Medium" size:16];
- _titleLabel.textAlignment = NSTextAlignmentCenter;
- _line = [CALayer new];
- _line.backgroundColor = UIColor.groupTableViewBackgroundColor.CGColor;
- [self.contentView addSubview:_titleLabel];
- [self.contentView.layer addSublayer:_line];
- }
- return self;
- }
- - (void)layoutSubviews {
- [super layoutSubviews];
- CGFloat width = self.contentView.bounds.size.width, height = self.contentView.bounds.size.height;
- CGFloat lineHeight = 0.5;
- _line.frame = CGRectMake(0, height - lineHeight, width, lineHeight);
- CGFloat offset = 15;
- _titleLabel.frame = CGRectMake(offset, 0, width - offset * 2, height);
- }
- @end
- static CGFloat kOffsetSpace = 5;
- @interface YBIBSheetView () <UITableViewDelegate, UITableViewDataSource>
- @property (nonatomic, strong) UITableView *tableView;
- @end
- @implementation YBIBSheetView {
- CGRect _tableShowFrame;
- CGRect _tableHideFrame;
- }
- #pragma mark - life cycle
- - (instancetype)initWithFrame:(CGRect)frame {
- self = [super initWithFrame:frame];
- if (self) {
- _cancelText = [YBIBCopywriter sharedCopywriter].cancel;
- _maxHeightScale = 0.7;
- _showDuration = 0.2;
- _hideDuration = 0.1;
- _cellHeight = 50;
- _backAlpha = 0.3;
- _actions = [NSMutableArray array];
-
- [self addSubview:self.tableView];
- }
- return self;
- }
- #pragma mark - public
- - (void)showToView:(UIView *)view orientation:(UIDeviceOrientation)orientation {
- if (self.actions.count == 0) return;
-
- [view addSubview:self];
- self.frame = view.bounds;
-
- UIEdgeInsets padding = YBIBPaddingByBrowserOrientation(orientation);
-
- CGFloat footerHeight = padding.bottom;
- CGFloat tableHeight = self.cellHeight * (self.actions.count + 1) + kOffsetSpace + footerHeight;
-
- _tableShowFrame = self.frame;
- _tableShowFrame.size.height = MIN(self.maxHeightScale * self.bounds.size.height, tableHeight);
- _tableShowFrame.origin.y = self.bounds.size.height - _tableShowFrame.size.height;
-
- _tableHideFrame = _tableShowFrame;
- _tableHideFrame.origin.y = self.bounds.size.height;
-
- self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0];
- self.tableView.frame = _tableHideFrame;
- self.tableView.tableFooterView.bounds = CGRectMake(0, 0, self.tableView.frame.size.width, footerHeight);
- [UIView animateWithDuration:self.showDuration animations:^{
- self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:self->_backAlpha];
- self.tableView.frame = self->_tableShowFrame;
- }];
- }
- - (void)hideWithAnimation:(BOOL)animation {
- if (!self.superview) return;
-
- void(^animationsBlock)(void) = ^{
- self.tableView.frame = self->_tableHideFrame;
- self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0];
- };
- void(^completionBlock)(BOOL n) = ^(BOOL n){
- [self removeFromSuperview];
- };
- if (animation) {
- [UIView animateWithDuration:self.hideDuration animations:animationsBlock completion:completionBlock];
- } else {
- animationsBlock();
- completionBlock(NO);
- }
- }
- #pragma mark - touch
- - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
- CGPoint point = [touches.anyObject locationInView:self];
- if (!CGRectContainsPoint(self.tableView.frame, point)) {
- [self hideWithAnimation:YES];
- }
- }
- #pragma mark - <UITableViewDataSource>
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
- return 2;
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
- return section == 0 ? self.actions.count : 1;
- }
- - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
- return self.cellHeight;
- }
- - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
- return section == 0 ? CGFLOAT_MIN : kOffsetSpace;
- }
- - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
- return CGFLOAT_MIN;
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
- YBIBSheetCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(YBIBSheetCell.self)];
- if (indexPath.section == 0) {
- cell.line.hidden = NO;
- YBIBSheetAction *action = self.actions[indexPath.row];
- cell.titleLabel.text = action.name;
- } else {
- cell.line.hidden = YES;
- cell.titleLabel.text = self.cancelText;
- }
- return cell;
- }
- #pragma mark - <UITableViewDelegate>
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
- if (indexPath.section == 0) {
- YBIBSheetAction *action = self.actions[indexPath.row];
- if (action.action) action.action(self.currentdata());
- } else {
- [self hideWithAnimation:YES];
- }
- }
- #pragma mark - getters
- - (UITableView *)tableView {
- if (!_tableView) {
- _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
- _tableView.delegate = self;
- _tableView.dataSource = self;
- _tableView.estimatedRowHeight = 44;
- _tableView.estimatedSectionFooterHeight = 0;
- _tableView.estimatedSectionHeaderHeight = 0;
- _tableView.backgroundColor = [UIColor clearColor];
- _tableView.alwaysBounceVertical = NO;
- _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
- if (@available(iOS 11.0, *)) {
- _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
- }
- UIView *footer = [UIView new];
- footer.backgroundColor = UIColor.whiteColor;
- _tableView.tableFooterView = footer;
- [_tableView registerClass:YBIBSheetCell.self forCellReuseIdentifier:NSStringFromClass(YBIBSheetCell.self)];
- }
- return _tableView;
- }
- @end
|