美文网首页
iOS开发-自定义弹窗的一种解决方式

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

作者: 来者可追文过饰非 | 来源:发表于2019-03-07 17:35 被阅读0次
如图所示,假如我们要实现这样的弹窗,用什么方法比较好呢? 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];

相关文章

网友评论

      本文标题:iOS开发-自定义弹窗的一种解决方式

      本文链接:https://www.haomeiwen.com/subject/mvlhpqtx.html