使用:

[MSAlertSheetView alertSheetViewWithButtons:@[@"男",@"女",@"取消"] CallBack:^(NSInteger index) {if (index == 2) {return ;}[self modifySexWithIndex:index];
}];

源码

#import "MSAlertSheetView.h"#define kScreenW  [UIScreen mainScreen].bounds.size.width#define kScreenH  [UIScreen mainScreen].bounds.size.height#define kActionH  40#define kActionW kScreenW - 40#define kPadding  20@interface MSAlertSheetView ()@property(assign,nonatomic)  CGFloat alertVH;
@property(strong,nonatomic)  UIView *alertV;@end@implementation MSAlertSheetViewstatic MSAlertSheetView *alerView = nil;+ (instancetype)defaultSingle{if(alerView == nil){alerView = [[MSAlertSheetView alloc] initWithFrame:CGRectMake(0, 0, kScreenW, kScreenH)];}[alerView makeUI];return alerView;
}- (void)makeUI{UIWindow *window = [UIApplication sharedApplication].keyWindow;alerView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0];alerView.frame = window.frame;[window addSubview:alerView];[UIView animateWithDuration:0.5 animations:^{alerView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];}];UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:alerView action:@selector(didClickMaskView)];[alerView addGestureRecognizer:tap];}+(void)alerViewWithButtons:(NSArray<NSString *> *)btns CallBack:(CallBack)callBack{alerView =  [MSAlertSheetView defaultSingle];NSInteger count = btns.count;alerView.alertVH = kActionH * (count + 2) + kPadding *(count - 1);UIView *alertV = [[UIView alloc] initWithFrame:CGRectMake(0, kScreenH , kScreenW, alerView.alertVH)];[UIView animateWithDuration:0.5 animations:^{alertV.frame = CGRectMake(0, kScreenH- alerView.alertVH, kScreenW, alerView.alertVH);}];alertV.backgroundColor = [UIColor redColor];alerView.alertV = alertV;[alerView addSubview:alertV];UIButton *lastBtn = nil;int i = 0;for (NSString *actionStr in btns) {UIButton *btn  = [UIButton buttonWithType:UIButtonTypeCustom];[btn setTitle:actionStr forState:UIControlStateNormal];btn.tag = i;if (lastBtn == nil) {btn.frame = CGRectMake(kPadding, kActionH, kActionW, kActionH);}else{btn.frame = CGRectMake(kPadding, kActionH + i *(kPadding + kActionH), kActionW, kActionH);}btn.backgroundColor = [UIColor lightGrayColor];lastBtn = btn;alerView.callBack = callBack;[btn addTarget:alerView action:@selector(didClickBtn:) forControlEvents:UIControlEventTouchUpInside];[alertV addSubview:btn];i++;}}- (void)didClickBtn:(UIButton *)btn{alerView.callBack(btn.tag);[alerView dismiss];}- (void)didClickMaskView{[alerView dismiss];}- (void)dismiss{[UIView animateWithDuration:0.5 animations:^{alerView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0];alerView.alertV.frame = CGRectMake(0, kScreenH , kScreenW, alerView.alertVH);} completion:^(BOOL finished) {[alerView removeFromSuperview];alerView = nil;}];}@end

自定义ActionSheetView相关推荐

  1. 程序主动进行电话短信报警,自定义电话、短信、钉钉报警通知

    程序主动进行电话短信报警,自定义电话.短信.钉钉报警通知 一. 规则说明 这里我们要利用到阿里云的云监控的手段,有一个叫做事件监控的东西,可以通过自定义事件上传来进行监控报警. 流程: 程序发现错误 ...

  2. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  3. IDEA自定义快捷指令,快捷生成代码、注释

    我们在使用idea时会发现有非常多的代码生成间接指令,比如输出指令.建主函数指令等等,只需要一个回车,代码就出来了,那我们能不能自定义这些东西呢?答案如下: 第一步,添加一个自定义组 第二步,单击新建 ...

  4. Oracle type (自定义类型的使用)

    oracle - type type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要 ...

  5. VS Code 安装 Go 插件、自定义扩展配置、断点调试

    1. 安装插件 使用快捷键 Ctrl+Shift+X 打开插件安装页面,安装 Go 插件. 2. 自定义扩展配置 使用快捷键 Ctrl+, 打开自定义配置页,编辑 settings.json ,定义与 ...

  6. VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件

    1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...

  7. 如何将自定义代码生成TVM

    如何将自定义代码生成TVM 如何将自定义代码生成TVM 本文参考链接: https://tvm.apache.org/docs/dev/how_to/relay_bring_your_own_code ...

  8. TVM自定义数据类型

    TVM自定义数据类型 本文将介绍"自定义数据类型"框架,该框架可在TVM中使用自定义数据类型. 介绍 在设计加速器时,关键是如何近似地表示硬件中的实数.这个问题具有长期的行业标准解 ...

  9. 自定义Kubernetes调度程序来编排高可用性应用程序

    自定义Kubernetes调度程序来编排高可用性应用程序 只要愿意遵守规则,在Kubernetes上进行部署和乘飞机旅行就可以很愉快.通常,事情会"正常工作".但是,如果有兴趣与必 ...

最新文章

  1. torch.nn.Linear()函数的理解
  2. 艾地计算机软件,多媒体技术原理与应用.pdf
  3. intelij idea启动之谜
  4. 机器学习里面的树形模型
  5. 记一次 .NET WPF布草管理系统 挂死分析
  6. C++(STL):34--- multiset容器详解
  7. 协议簇:TCP 解析: Sequence Number
  8. H3C 路由度量值(Metric)
  9. 算法总结系列之八:复读机的故事 - 散列表.NET应用的研究(下集)
  10. ADO.NET 之 一
  11. bat复制文件到指定目录同名_利用bat让文件在指定时间自动进行备份
  12. Vue3下的视频直播流方法(RTSP和HLS流)
  13. C语言运算符和结合性
  14. Java8日期类型常见用法总结
  15. Bootstrap的js插件之側边栏停靠(affix)
  16. window的mysql开机自动启动
  17. 跟我做一个可以聊天的 Visual Studio Code 插件
  18. 基于thrift的匹配操作
  19. 微信网页游戏刷分BUG利用——抓包分析记录
  20. 从招聘网站分析大数据相关职位现状

热门文章

  1. windows安装gnvm安装教程,node多版本解决方案
  2. 在Openstack上部署compute节点上时,开启服务openstack-nova-compute.service无法启动的解决方法
  3. 记一次用pip安装docker-compose报错及解决方法
  4. 提示“Web打印服务CLodop未安装启动”的各种原因和解决方法
  5. 在图像旁边垂直对齐文字?
  6. win server2008搭建ftp服务器
  7. Java数据结构与算法之排序
  8. Web前端工程师工作前 VS 工作后
  9. 《网站分析师实战指南》一2.6 让例行公事的报告见鬼去吧
  10. snmpwalk用法