iOS开发-自定义弹窗的一种解决方式

如图所示,假如我们要实现这样的弹窗,用什么方法比较好呢?
YD20190307-172401.png
先说下之前的一种笨方法吧,在self.view的最上层先添加一个半透明的CoverView,然后再添加这块视图contentView,通过控制CoverView和ContentView的Hidden来控制是否显示

弊端:
1.会使Controller里面代码比较臃肿(当然可以通过分类,分离相关代码)
2.动画不太好做

今天要介绍的方法,是采用一个单独的ViewController来实现这个弹窗,细节代码如下
#import "XPCPopAlertController.h"

@interface XPCPopAlertController ()
@property (nonatomic, strong) UIView *content;
@end

@implementation XPCPopAlertController

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // 这一步非常重要
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setviews];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    // 动画效果
    [UIView animateWithDuration:0.25f
                          delay:0.0f
                        options:UIViewAnimationOptionCurveEaseIn animations:^{
                            self.content.alpha = 1;
                        } completion:nil];
}
// 视图和布局
- (void)setviews {
    self.view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    
    UIView *content = [[UIView alloc] init];
    content.backgroundColor = [UIColor whiteColor];
    content.layer.cornerRadius = kSCALE(8);
    content.clipsToBounds = YES;
    content.alpha = 0;
    [self.view addSubview:content];
    _content = content;
    
    // 获取语音验证码
    UILabel *titleL = [[UILabel alloc] init];
    titleL.font = [UIFont fontWithName:@"PingFangSC-Semibold" size:kSCALE(16)];
    titleL.text = @"获取语音验证码";
    titleL.textColor = UIColor.blackColor;
    [titleL sizeToFit];
    [content addSubview:titleL];
    
    // 将电话告知您验证码,请注意接听!
    UILabel *detailL = [[UILabel alloc] init];
    detailL.font = [UIFont fontWithName:@"PingFangSC-Regular" size:kSCALE(14)];
    detailL.textColor = UIColor.blackColor;
    detailL.text = @"将电话告知您验证码,请注意接听!";
    [detailL sizeToFit];
    [content addSubview:detailL];
    
    // 横线
    UIView *line = [UIView new];
    line.backgroundColor = RGBColor(0xd9d9d9);
    [content addSubview:line];
    
    // 知道了
    UIButton *knowB = [[UIButton alloc] init];
    [knowB setTitle:@"知道了" forState:UIControlStateNormal];
    [knowB setTitleColor:RGBColor(0xff3333) forState:UIControlStateNormal];
    [knowB.titleLabel setFont:[UIFont fontWithName:@"PingFangSC-Semibold" size:kSCALE(15)]];
    [knowB addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside];
    [content addSubview:knowB];
    
    //
    [content mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(kSCALE(280), kSCALE(133)));
        make.center.equalTo(self.view);
    }];
    
    [titleL mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(kSCALE(16));
        make.top.mas_equalTo(kSCALE(24));
        make.centerX.equalTo(content);
    }];
    
    [detailL mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(kSCALE(14));
        make.top.mas_equalTo(titleL.mas_bottom).offset(12);
        make.centerX.equalTo(content);
    }];
    
    [line mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(kOnePx);
        make.left.right.equalTo(content);
        make.top.mas_equalTo(detailL.mas_bottom).offset(kSCALE(23));
    }];
    
    [knowB mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.bottom.equalTo(content);
        make.top.mas_equalTo(line.mas_bottom);
    }];
}

- (void)dismiss {
    [self dismissViewControllerAnimated:NO completion:nil];
}

@end

弹出弹窗时,直接采用以下方法

 XPCPopAlertController *vc = [[XPCPopAlertController alloc] init];
 [self.navigationController presentViewController:vc animated:NO completion:nil];
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,093评论 1 32
  • 以下文章来自于网络论坛。然后摘抄至自己的简书。原文链接大家可以自己去网上搜。此文仅供参考。 当我们开始设计View...
    不够果断是种癌阅读 1,486评论 1 11
  • 之前听到一个很搞笑的笑话: 一个人从床上摔下来,来到了医院,医生问他:你哪里受伤了?病人回答:我也不知道,按哪里哪...
    欣欣然也阅读 297评论 0 3
  • 小学低年级的时候,孩子们各个都是小淘气,谁不爱玩,爱睡个懒觉,爱吃点好吃的。 对于那时的我①来说,上学实在是件...
    一乱眼繁华FL阅读 271评论 0 1
  • 进入初三已经快两个月了,从期初考到第一次月考,你的成绩都有了很大的进步、家长群里表扬名单里能找到你的名字了,昨天居...
    芃宝娘阅读 201评论 0 0