iOS開發之自訂ActionSheet視圖__iOS

來源:互聯網
上載者:User

有時我們需要用到actionSheet來展示,但是但是往往系統的介面顯示很醜或者並不符合UI的要求,所以在這裡自訂一個,方便以後使用,後續有時間寫一下Swift的開發。

自訂ActionSheet的關鍵點,就是UI的樣式修改和設計調整,還有就是點擊儲存格時進行的後續操作,再一個就是介面顯示的平滑度。

首先介面設計:

建立一個半透明的背景視圖;

然後一個表格,表格分成兩個區,設定標題頭、區尾和儲存格邊角

//背景- (UIView*)maskView {    if (!_maskView) {        _maskView = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];        _maskView.backgroundColor = [UIColor blackColor];        _maskView.alpha = 0.5;        _maskView.userInteractionEnabled = YES;    }    return _maskView;}//表格- (UITableView *)tableView {    if (!_tableView) {        _tableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStylePlain];        _tableView.delegate = self;        _tableView.dataSource = self;        _tableView.layer.cornerRadius = 10;        _tableView.clipsToBounds = YES;        _tableView.rowHeight = 44.0;        _tableView.bounces = NO;        _tableView.backgroundColor = [UIColor clearColor];        _tableView.tableHeaderView = self.headView;        _tableView.separatorInset = UIEdgeInsetsMake(0, -50, 0, 0);        [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"OneCell"];    }    return _tableView;}#pragma mark <UITableViewDelegate,UITableViewDataSource>- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {    return 2;}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {    return (section == 0)?_cellArray.count:1;}- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"OneCell"];    if (indexPath.section == 0) {        cell.textLabel.text = _cellArray[indexPath.row];        if (indexPath.row == _cellArray.count - 1) {                        //添加貝茲路徑,UIBezierPath與CAShapeLayer設計邊角樣式            /*             byRoundingCorners即為設定所需處理邊角參數,有如下枚舉克進行選擇:             typedef NS_OPTIONS(NSUInteger, UIRectCorner) {             UIRectCornerTopLeft     = 1 << 0,//左上圓角             UIRectCornerTopRight    = 1 << 1,//右上圓角             UIRectCornerBottomLeft  = 1 << 2,//左下圓角             UIRectCornerBottomRight = 1 << 3,//右下圓角             UIRectCornerAllCorners  = ~0UL   //四角圓角             };             */            UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, Screen_Width - (Space_Line * 2), tableView.rowHeight) byRoundingCorners:UIRectCornerBottomLeft|UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];            CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];            maskLayer.frame = cell.contentView.bounds;            maskLayer.path = maskPath.CGPath;            cell.layer.mask = maskLayer;        }    } else {        cell.textLabel.text = _cancelTitle;        cell.layer.cornerRadius = 10;    }    cell.textLabel.textAlignment = NSTextAlignmentCenter;    cell.selectionStyle = UITableViewCellSelectionStyleNone;    return cell;}- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {    if (indexPath.section == 0) {        if (self.selectedBlock) {            self.selectedBlock(indexPath.row);        }    } else {        if (self.cancelBlock) {            self.cancelBlock();        }    }    [self dismiss];}- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {    return Space_Line;}- (UIView*)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {    UIView *footerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, Space_Line)];    footerView.backgroundColor = [UIColor clearColor];    return footerView;}
介面設計完成,需要考慮的就是彈出、消失的問題

/滑動彈出- (void)show {    _tableView.frame = CGRectMake(Space_Line, Screen_Height, Screen_Width - (Space_Line * 2), _tableView.rowHeight * (_cellArray.count + 1) + _headView.bounds.size.height + (Space_Line * 2));    [UIView animateWithDuration:.5 animations:^{        CGRect rect = _tableView.frame;        rect.origin.y -= _tableView.bounds.size.height;        _tableView.frame = rect;    }];}//滑動消失- (void)dismiss {    [UIView animateWithDuration:.5 animations:^{        CGRect rect = _tableView.frame;        rect.origin.y += _tableView.bounds.size.height;        _tableView.frame = rect;    } completion:^(BOOL finished) {        [self removeFromSuperview];    }];}#pragma mark ------ 觸控螢幕幕其他位置彈下- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {    [self dismiss];}
最後是對自訂的視圖的調用:

//彈出ActionSheet    __weak typeof(self) weakSelf = self;    JasonActionSheetView *jasonSheetView = [[JasonActionSheetView alloc]initWithHeadView:self.headView cellArray:self.dataArr cancelTitle:@"取消" selectedBlock:^(NSInteger index) {        //點擊儲存格後續操作        if (index == 0) {            weakSelf.view.backgroundColor = [UIColor redColor];        }else if(index == 1){            weakSelf.view.backgroundColor = [UIColor yellowColor];        }else{            weakSelf.view.backgroundColor = [UIColor lightGrayColor];        }    } cancelBlock:^{        NSLog(@"點擊了取消........");    }];        [self.view addSubview:jasonSheetView];
效果圖:



源碼:https://github.com/hbblzjy/OC-JasonActionSheet




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.