iOS 可高度自定义的底部弹框

技术: iOS Objective-C

概述

一个可以让开发者通过编写 tableView 的内容随心所欲的定制自己想要的底部弹框

详细

代码下载:http://www.demodashi.com/demo/14901.html

一. 运行效果图

二. 实现过程

1. 实现一个有遮罩效果的半透明 view,然后添加一个可设置展示内容高度的 contentView

// 这个遮罩是可以遮住全屏
- (void)createUI{
    self.frame = CGRectMake(0, 0, SS_ScreenW, SS_ScreenH);
    self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.4];
    self.userInteractionEnabled = YES;
    [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(disMissView)]];
    [self.contentView addSubview:self.tbView];
}
// contentView 是通过懒加载实现的
- (UIView *)contentView{
    if (!_contentView) {
        _contentView = [UIView new];
        _contentView.backgroundColor = [UIColor whiteColor];
        _contentView.frame = CGRectMake(0, SS_ScreenH - _contentHeight - SS_BottomMargin,  SS_ScreenW, _contentHeight + SS_BottomMargin);
        _contentView.opaque = YES;
        [self addSubview:_contentView];
    }
    return _contentView;
}

2. 我们实现的底部弹框实质上一个可滑动的表单(tableView),在 contentView 上添加一个 tableView

- (UITableView *)tbView{
    if (!_tbView) {
//        _tbView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStyleGrouped];
        _tbView = [UITableView new];
        _tbView.delegate = self;
        _tbView.dataSource = self;
        [_tbView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"ss"];
    }
    return _tbView;
}

3. 通过设置UIView 动画,实现遮罩 menuView 的展示和消失效果

// 将 menuView 展示在父 view 上
[view addSubview:self];
    [view addSubview:self.contentView];
    self.contentView.frame = CGRectMake(0, SS_ScreenH, SS_ScreenW, _contentHeight);
    __weak typeof(self) weakSelf = self;
    [UIView animateWithDuration:_animationDuration animations:^{
        self.alpha = 1.0;
        self.contentView.frame = CGRectMake(0, SS_ScreenH - weakSelf.contentHeight - SS_BottomMargin, SS_ScreenW, weakSelf.contentHeight + SS_BottomMargin);
    } completion:^(BOOL finished) {

    }];

// 将 menuView 从父 view 上移除
__weak typeof(self) weakSelf = self;
    [UIView animateWithDuration:_animationDuration animations:^{
        self.alpha = 0.0;
        self.contentView.frame = CGRectMake(0, SS_ScreenH, SS_ScreenW, weakSelf.contentHeight);
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
        [self.contentView removeFromSuperview];
    }];

4. 实现选项和头部的定制化

通过编写自己的代理方法,让开发人员根据自己项目的实际需要设置各个选项,并且可以定制固定的头部以及底部

@protocol SSMenuViewDelegate <NSObject>
@required;
// 返回 tableView 的行数
- (NSInteger)menuTableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
// 返回 tableViewCell 需要自定义 cell 的分割线
- (UITableViewCell *)menuTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
@optional;
// 设置组数
- (NSInteger)menuNumberOfSectionsInTableView:(UITableView *)tableView;
// 选中某个 tableView Cell
- (void)menuTableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
// 定义每个选项的cell的高度
- (CGFloat)menuTableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
// 定义headerView
- (UIView *)menuTableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
// 定义headerView 的高度
- (CGFloat)menuTableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
// 定义 footterView
- (UIView *)menuTableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
- (CGFloat)menuTableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
@end

三. 项目结构

四. 使用手册

1. 首先,根据目录,将 SSMenuView.h, SSMenuView.m 文件,添加到自己项目中

2. 创建弹框控件

由于在使用类似弹框的时候,用户可能会多次点击使用,为了避免重复创建,建议使用懒加载创建一个弹窗控件

# pragma
# pragma mark - Lazy -
- (SSMenuView *)menuView{
    if (!_menuView) {
        _menuView = [SSMenuView new];
        _menuView.delegate = self;
//        _menuView.contentHeight = 44 * 6;
//        _menuView.tbView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
    return _menuView;
}

3. 根据自己的项目需要,创建自己的弹框内容

# pragma
# pragma mark - SSMenuViewDelegate -
- (NSInteger)menuTableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 4;
}
- (UITableViewCell *)menuTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID"];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:@"cellID"];
    }
    cell.textLabel.textAlignment = NSTextAlignmentCenter;
    cell.textLabel.text = [NSString stringWithFormat:@"这是选项%ld",indexPath.row];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}
- (CGFloat)menuTableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return 44;
}
- (CGFloat)menuTableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 44;
}
- (UIView *)menuTableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
    UIView *footer = [UIView new];
    footer.backgroundColor = [UIColor orangeColor];
    return footer;
}
- (UIView *)menuTableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    UIView *header = [UIView new];
    header.backgroundColor = [UIColor whiteColor];
    header.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44);
    UILabel *lab = [UILabel new];
    lab.text = @"这是选项的头部";
    [header addSubview:lab];
    lab.textAlignment = NSTextAlignmentCenter;
    lab.frame = header.frame;

    return header;
}

4. 根据需要,在触发点击事件,弹出弹框

此处,有2种展示方式,根据开发者自己的需要选择是否将弹框完全全屏

- (IBAction)click:(id)sender {
//    [self.menuView showInView:self.view];
    [self.menuView showInWindow];
}
//  隐藏弹框
[self.menuView disMissView];

代码下载:http://www.demodashi.com/demo/14901.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

原文地址:https://www.cnblogs.com/demodashi/p/10503414.html

时间: 2024-10-05 13:00:26

iOS 可高度自定义的底部弹框的相关文章

MUI 自定义从底部弹出的弹出框

1)效果: 点击“点击就送”那个按钮之后,弹窗从底部弹出并自带蒙层,然后点击弹窗之外的灰色部分就从底部消失: 第一步:引入 mui.css或者mui.min.css 引入 mui.min.js或者mui.js 第二步:<a href="弹窗ID"> </a> <div id="弹窗ID" class="box mui-popover mui-popover-action mui-popover-bottom">

小程序自定义类似于选择器弹框

在开发小程序时,隐藏和显示是我们用的比较多的一种,但是就简简单单的显示隐藏,有的时候觉得太low,所以分享一个类似于城市选择器那种从下到上的那种弹框: 这中间就要用到小程序动画    Animation 已经是写好的小demo:可以直接拿过来使用: .wxml <button bindtap="showModel">弹框显示</button> <!-- 弹框 --> <!-- 渐深的背景层 --> <view class='{{bg

自学iOS开发小功能之三:弹框的两种方式(iOS8.3之后新的方式,之前的已经弃用)

1.弹框出现在屏幕中间位置 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"是否退出" preferredStyle: UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActio

MUI 自定义从底部弹出的弹出框内容

最近做的项目都是在使用mui做手机网页,大致是下面的这种弹出效果 首先,引入 mui.css或者mui.min.css 引入 mui.min.js或者mui.js 第二步:<a href="#弹窗ID"> </a> //控制弹窗的显示隐藏 <div id="弹窗ID" class="box mui-popover mui-popover-action mui-popover-bottom"></div&g

自定义插件学习-弹框2

;(function($) { $.alerts = { verticalOffset: -75, horizontalOffset: 100, repositionOnResize: true, overlayOpacity: 0.50, overlayColor: "#FFF", draggable: true, okButton: "确 定", cancelButton: "取 消", dialogClass: null, alert: f

presentViewController底部弹框适配ipad

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ffffff; background-color: #000000 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ffffff; background-color: #000000; min-height: 16.0px } p.p3 { margin: 0.0px 0

3种常用IOS弹框

目前为止,已经知道3种IOS弹框: 1.系统弹框-底部弹框 UIActionSheet (1)用法:处理用户非常危险的操作,比如注销系统等 (2)举例: UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButton

ios中的三种弹框

目前为止,已经知道3种IOS弹框: 1.系统弹框-底部弹框 UIActionSheet (1)用法:处理用户非常危险的操作,比如注销系统等 (2)举例: UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButton

RN code push自定义弹框

最近在弄react native的code push热更新问题.开始是用的后台默默更新配置.由于微软服务器速度问题,经常遇到用户一直在下载中问题.而用户也不知道代码需要更新才能使用新功能,影响了正常业务流程.而目前公司也无力搭建自己的服务器和dns设置.所以比较快速的方案就是,前端自定义热更新弹框,在需要更新代码的情况下禁止用户向下操作. ok,废话少说,直接上代码: 这是构建一个弹框,强制文案提示和非强制文案提示弹框. /** * Created by susie on 2018/9/20.