在我们的实际开发项目中,弹窗是必不可少的,很多时候我们用的是系统的AlertViewController,但是实际情况中,并不能满足我们的开发需求,这个时候我们需要的就是自定义自己的弹窗效果。接下来我会写一些自己的所封装的弹窗效果。包括代理delegate回调,block 回调,xib新建view来创建我们需要的弹窗效果。

官方思路

1.在我们自己动手之前一定要先看看官方是怎么封装的,这样我们写出来的代码才接近苹果语言,看起来高大上。好的代码一定是见名知意的,别人一看这个方法就知道大概我们通过这个方法可以得到什么样的效果。

// ios8.0 之后

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"提示" message:@"message" preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];

UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

NSLog(@"确定");

}];

[alertController addAction:cancelAction];

[alertController addAction:okAction];

[self presentViewController:alertController animated:YES completion:nil];

// ios8.0 之前

UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Tittle" message:@"This is message" delegate:self

cancelButtonTitle:@"cancel" otherButtonTitles:nil, nil];

[alertView show];

因为在代码量风格上,我还是比较喜欢老版本的弹窗,毕竟代码上啊,一句话调用美滋滋。所以接下来我们封装也是模仿官方开始.....

delegate

我们可以看到在苹果官方中,我们需要通过识别用户点击某个按钮来确定需要进一步的操作事件,这个时候是通过代理来实现的。代理的话,我们在熟悉不过了。

首先申明协议

#pragma mark - 协议

@class HLAlertView;

@protocol HLAlertViewDelegate

- (void)alertViewDidClickButtonWithIndex:(NSInteger)index;

@end

在viewController中遵循代理,设置代理 , 实现方法即可

self.delegate = self;

#pragma mark --- HLAlertViewDelegate

-(void)alertViewDidClickButtonWithIndex:(NSInteger)index{

if (index == AlertSureButtonClick) {

[self alertSureButtonClick];

}else{

[self alertCauseButtonClick];

}

}

接下来就是实现我们封装类的.h文件方法申明,以及.m的实现方法

//.h 文件

#import

typedef enum : NSUInteger {

AlertCauseButtonClick = 0,

AlertSureButtonClick

} AlertButtonClickIndex;

#pragma mark - 协议

@class HLAlertView;

@protocol HLAlertViewDelegate

- (void)alertViewDidClickButtonWithIndex:(NSInteger)index;

@end

@interface HLAlertView : UIView

@property(nonatomic, weak) id delegate;

- (instancetype)initWithTittle:(NSString *)tittle message:(NSString *)message sureButton:(NSString *)sureBtn;

- (void)show;

@end

@interface HLAlertView()

/** 弹窗主内容view */

@property (nonatomic,strong) UIView *contentView;

/** 弹窗标题 */

@property (nonatomic,copy) NSString *title;

/** message */

@property (nonatomic,copy) NSString *message;

/** 确认按钮 */

@property (nonatomic,copy) UIButton *sureButton;

@end

@implementation HLAlertView

- (instancetype)initWithTittle:(NSString *)tittle message:(NSString *)message sureButton:(NSString *)sureBtn{

if (self = [super init]) {

self.title = tittle;

self.message = message;

[self sutUpView];

}

return self;

}

- (void)sutUpView{

self.frame = [UIScreen mainScreen].bounds;

self.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.85];

[UIView animateWithDuration:0.5 animations:^{

self.alpha = 1;

}];

//------- 弹窗主内容 -------//

self.contentView = [[UIView alloc]init];

self.contentView.frame = CGRectMake(0, 0, SCREEN_WIDTH - 80, 150);

self.contentView.center = self.center;

self.contentView.backgroundColor = [UIColor whiteColor];

self.contentView.layer.cornerRadius = 6;

[self addSubview:self.contentView];

// 标题

UILabel *titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, self.contentView.width, 22)];

titleLabel.font = [UIFont boldSystemFontOfSize:20];

titleLabel.textAlignment = NSTextAlignmentCenter;

titleLabel.text = self.title;

[self.contentView addSubview:titleLabel];

// message

UILabel *messageLable = [[UILabel alloc]initWithFrame:CGRectMake(0, 50, self.contentView.width, 22)];

messageLable.font = [UIFont boldSystemFontOfSize:17];

messageLable.textAlignment = NSTextAlignmentCenter;

messageLable.text = self.message;

[self.contentView addSubview:messageLable];

// 取消按钮

UIButton * causeBtn = [UIButton buttonWithType:UIButtonTypeCustom];

causeBtn.frame = CGRectMake(0, self.contentView.height - 40, self.contentView.width/2, 40);

causeBtn.backgroundColor = [UIColor grayColor];

[causeBtn setTitle:@"取消" forState:UIControlStateNormal];

[causeBtn addTarget:self action:@selector(causeBtn:) forControlEvents:UIControlEventTouchUpInside];

[self.contentView addSubview:causeBtn];

// 确认按钮

UIButton * sureButton = [UIButton buttonWithType:UIButtonTypeCustom];

sureButton.frame = CGRectMake(causeBtn.width, causeBtn.y, causeBtn.width, 40);

sureButton.backgroundColor = [UIColor redColor];

[sureButton setTitle:@"确定" forState:UIControlStateNormal];

[sureButton addTarget:self action:@selector(processSure:) forControlEvents:UIControlEventTouchUpInside];

[self.contentView addSubview:sureButton];

}

- (void)show{

UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;

[keyWindow addSubview:self];

}

- (void)processSure:(UIButton *)sender{

if ([self.delegate respondsToSelector:@selector(alertViewDidClickButtonWithIndex:)]) {

[self.delegate alertViewDidClickButtonWithIndex:AlertSureButtonClick];

}

[self dismiss];

}

- (void)causeBtn:(UIButton *)sender{

if ([self.delegate respondsToSelector:@selector(alertViewDidClickButtonWithIndex:)]) {

[self.delegate alertViewDidClickButtonWithIndex:AlertCauseButtonClick];

}

[self dismiss];

}

#pragma mark - 移除此弹窗

/** 移除此弹窗 */

- (void)dismiss{

[self removeFromSuperview];

}

通过代理的方式我们就完成了我们自己页面的封装了。

block弹窗

先看一下封装之后我们的调用方式吧:

HLAlertViewBlock * alertView = [[HLAlertViewBlock alloc] initWithTittle:@"提示" message:@"通过Block弹窗回调的弹窗" block:^(NSInteger index) {

if (index == AlertSureButtonClick) {

[self alertSureButtonClick];

}else{

[self alertCauseButtonClick];

}

}];

[alertView show];

相比代理的方式的话,我们还行喜欢这种block回调的,简大气接地气啊。当然在我们需要处理逻辑多的时候,还是代理会比较好一点,具体环境下具体使用。

封装成block的好处就是在我们构造方法的时候就可以实现我们将来的点击方法,所以在自定义弹窗类的.h文件中,我们要申明block属性。代码

//.h

@interface HLAlertViewBlock : UIView

@property(nonatomic, copy) void (^buttonBlock) (NSInteger index);

- (instancetype)initWithTittle:(NSString *)tittle message:(NSString *)message block:(void (^) (NSInteger index))block;

- (void)show;

@end

//.m

@interface HLAlertViewBlock()

/** 弹窗主内容view */

@property (nonatomic,strong) UIView *contentView;

/** 弹窗标题 */

@property (nonatomic,copy) NSString *title;

/** message */

@property (nonatomic,copy) NSString *message;

/** 确认按钮 */

@property (nonatomic,copy) UIButton *sureButton;

@end

@implementation HLAlertViewBlock

- (instancetype)initWithTittle:(NSString *)tittle message:(NSString *)message block:(void (^)(NSInteger))block{

if (self = [super init]) {

self.title = tittle;

self.message = message;

self.buttonBlock = block;

[self sutUpView];

}

return self;

}

到此为止,我们的block弹窗申明方法也搞定了。

xib的封装弹窗

图片.png

好处就是不用写界面代码了。

殊途同归

还有一种实现弹窗效果的方法,不通过新建view而是Controller来实现的,就是新建一个透明的控制器。代码如下

PopViewController * popVC = [[PopViewController alloc] init];

UIColor * color = [UIColor blackColor];

popVC.view.backgroundColor = [color colorWithAlphaComponent:0.85];

popVC.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:popVC animated:NO completion:nil];

更加简单,逻辑也更加好处理一些。

最后附上demo地址:gibHub地址:https://github.com/MrBMask

ios uiwindow弹窗_iOS 你需要的弹窗大全相关推荐

  1. 添加弹窗_阻止电脑广告弹窗窗口让电脑桌面更清洁

    在使用计算机上网过程中,经常会弹出一些广告弹窗,这些弹窗或者会干扰到我们的使用计算机的体验,有的则会对桌面内容进行一些遮挡,非常可恶. 那么我们怎么对广告弹窗进行拦截不让它们干扰我们使用计算机呢? 我 ...

  2. Android 天气APP(十三)仿微信弹窗(右上角加号点击弹窗效果)、自定义背景图片、UI优化调整

    上一篇:Android 天气APP(十二)空气质量.UI优化调整 天气预报详情,逐小时预报详情 新版------------------- 一.适配器点击监听 二.页面实现 三.天气预报详情弹窗 四. ...

  3. JS函数自定义弹窗;纯JS实现弹窗

    弹窗 获取弹窗内穿出的数据: 在弹窗页面调用父级页面的方法,例:parent.xxx(data); 在 xxx()方法中将获取到的数据赋值给 abc 变量:在的点击弹窗确定按钮后调用 yyy()方法, ...

  4. ios uiwindow弹窗_iOS-UIWindow详解

    1.UIWindow简介 UIWindow是一种特殊的UIView,通常在一个app中至少会有一个UIWindow. iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的V ...

  5. qdialog不允许放大缩小弹窗_iOS 13系统太烦人!频繁弹窗提醒App正在定位,竟是为保护隐私?...

    近日,针对iOS 13系统用户频繁收到App追踪消息的弹窗提醒这一问题,苹果回应称,此项更新功能旨在保护用户的隐私,避免被App在后台窃取用户的位置信息并追踪. 据相关媒体报道称,有些开发者担心此项定 ...

  6. iOS小技能:简化版的隐私弹窗

    文章目录 引言 I demo项目简介 1.1 使用`Cocoapods` 管理第三方库依赖 1.2 使用MVVM架构 1.3 使用常量配置数据 1.4 同意/拒绝协议处理逻辑 1.5 demo下载 I ...

  7. 如何主动触发时间选择器弹窗_请合理使用Alert弹窗

    最近做了不少产品的竞品分析,执行一些操作时不免遇到各式各样的模态弹窗,有些弹窗总是意想不到的出现,令我抓狂,导致我不得不认真阅读弹窗内的文字信息,并作出选择:有时候我会习惯性点击右侧的按钮,发现操作后 ...

  8. iOS 12升级_iOS 12描述文件安装操作方法

    可以通过安装iOS 12 测试版描述文件后,在设备软件更新中将系统升级到iOS 12测试版. 注意:升级iOS 12后无法保留设备内资料进行降级,请升级前注意备份重要资料. 安装描述文件升级iOS 1 ...

  9. 转帖:iOS UIWindow UIWindowLevel

    原文地址:http://www.cnblogs.com/smileEvday/archive/2012/03/27/2420362.html 一.UIWindow是一种特殊的UIView,通常在一个程 ...

最新文章

  1. c++ssh连接_一步步使SSH连接您的github仓库
  2. 提示“Web打印服务CLodop未安装启动”的各种原因和解决方法
  3. spring mvc 总体启动流程
  4. kafka0.8消费者实例
  5. Webpack基础之输出
  6. mybatisplus 增删改查(普通)
  7. MySQL数据库 实验报告(三)
  8. 圆弧周长公式_弧长计算公式
  9. 弘辽科技:拼多多店铺评分多久更新一次?怎么提高?
  10. 没有对比就没有伤害:《明日之后》竟成最良心国产末日手游?
  11. 我的理想,我的奋斗目标
  12. ElasticJob源码部分解读-Zookeeper建立连接
  13. 教你在 Ubuntu 安装 uTorrent
  14. 违反和解除劳动合同的经济补偿办法
  15. python mysql_config not found_解决问题:OSError: mysql_config not found
  16. 基于Javaweb实现餐饮管理系统
  17. the type java.lang.Object cannot be resolved. It is indirectly referenced from ..
  18. Eclipse如何开发Android?
  19. 怎样才能保证服务器数据的安全?
  20. 学习:EtherCAT总线三种同步模式分析

热门文章

  1. SAP Spartacus 服务器端渲染模式下,在 Node.js 服务器端渲染视图的单步调试
  2. Rxjs merge 学习笔记
  3. 关闭excel多余的addin,提供excel启动速度
  4. fixture.detectChange是如何触发Component view的ngOnInit钩子的
  5. SAP Spartacus里Commerce后台CMS Component和前台Angular的一一映射关系
  6. 一个简单的Angular search UI实现
  7. SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下
  8. SAP CRM Product workflow debug
  9. UI5应用如果出现白屏但是没有任何错误消息打印出来,应该如何处理
  10. SAP Kyma GraphQL storage实现