iOS中你需要的弹窗效果总结大全

 更新时间:2018年09月27日 08:36:55   作者:MrBMask  
弹窗是app中常见控件之一,一般由于项目需求,我们很少能直接使用系统提供的弹窗,这个时候就需要我们根据产品需求封装自定义弹窗了。下面这篇文章主要给大家介绍了关于iOS中你需要的弹窗效果的相关资料,需要的朋友可以参考下

前言

弹框是人机交互中常见的方式,常常出现于询问、警示以及完成某个插入任务,常见于网页端及移动端。弹框能使用户有效聚焦于当前最紧急的信息,也可以在不用离开当前页面的前提下,完成一些轻量的任务。

在我们的实际开发项目中,弹窗是必不可少的,很多时候我们用的是系统的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

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

1、首先申明协议

#pragma mark - 协议
@class HLAlertView;
@protocol HLAlertViewDelegate<NSObject>
- (void)alertViewDidClickButtonWithIndex:(NSInteger)index;
@end

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

<HLAlertViewDelegate>
self.delegate = self;

#pragma mark --- HLAlertViewDelegate
-(void)alertViewDidClickButtonWithIndex:(NSInteger)index{
if (index == AlertSureButtonClick) {
[self alertSureButtonClick];
}else{
[self alertCauseButtonClick];
}
}

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

//.h 文件
#import <UIKit/UIKit.h>

typedef enum : NSUInteger {
AlertCauseButtonClick = 0,
AlertSureButtonClick
} AlertButtonClickIndex;

#pragma mark - 协议
@class HLAlertView;
@protocol HLAlertViewDelegate<NSObject>
- (void)alertViewDidClickButtonWithIndex:(NSInteger)index;
@end
@interface HLAlertView : UIView

@property(nonatomic, weak) id <HLAlertViewDelegate> 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的封装弹窗

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

殊途同归

还有一种实现弹窗效果的方法,不通过新建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 scrollview实现三屏复用循环广告

    iOS scrollview实现三屏复用循环广告

    这篇文章主要介绍了iOS scrollview实现三屏复用循环广告,从服务器请求的广告,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • iOS13 适配和Xcode11.0踩坑小结

    iOS13 适配和Xcode11.0踩坑小结

    这篇文章主要介绍了iOS13 适配和Xcode11.0踩坑小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • iOS实现卡片堆叠效果

    iOS实现卡片堆叠效果

    这篇文章主要为大家详细介绍了iOS实现卡片堆叠效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • iOS实现简单的抽屉效果

    iOS实现简单的抽屉效果

    这篇文章主要为大家详细介绍了iOS实现简单的抽屉效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • iOS中设置网络超时时间+模拟的方法详解

    iOS中设置网络超时时间+模拟的方法详解

    这篇文章主要介绍了在iOS中设置网络超时时间+模拟的方法,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来跟着小编一起来学习学习吧。
    2017-04-04
  • iOS开发中使用UIWebView 屏蔽 alert警告框

    iOS开发中使用UIWebView 屏蔽 alert警告框

    这篇文章主要介绍了iOS开发中使用UIWebView 屏蔽 alert警告框的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • IOS代码笔记之文字走马灯效果

    IOS代码笔记之文字走马灯效果

    这篇文章主要为大家详细介绍了IOS实现文字走马灯效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • 详解iOS App中UITableView的创建与内容刷新

    详解iOS App中UITableView的创建与内容刷新

    这篇文章主要介绍了iOS App中UITableView的创建与内容刷新,讲解了UITableView一些基本的样式与cell的设置及刷新,需要的朋友可以参考下
    2016-04-04
  • iOS archive保存图片到本地的方法

    iOS archive保存图片到本地的方法

    这篇文章主要为大家详细介绍了iOS archive保存图片到本地的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • iOS模拟中奖名单循环滚动效果

    iOS模拟中奖名单循环滚动效果

    这篇文章主要为大家详细介绍了iOS模拟中奖名单循环滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09

最新评论