美文网首页
仿微信Alert样式

仿微信Alert样式

作者: 云天涯丶 | 来源:发表于2018-03-26 17:45 被阅读14次

废话不多说,直接看代码

.h文件

@interface YAlertView : UIView

- (instancetype)initWithTitleArray:(NSArray *)titleArray finish:(void (^)(NSInteger index))finish;

// 显示
- (void)show;

@end

.m文件

@interface YAlertView ()

@property (nonatomic,strong) UIView *mainView;// 主界面
@property (nonatomic,copy) NSArray *titleArray;
@property (nonatomic,copy) void(^finish)(NSInteger index);

@end

static CGFloat const bottomH = 5;
static CGFloat const gap = 1;
static CGFloat const blockH = 50;

@implementation YAlertView

- (instancetype)initWithTitleArray:(NSArray *)titleArray finish:(void (^)(NSInteger index))finish
{
    self = [super init];
    if (self) {
        self.titleArray = titleArray;
        self.finish = finish;
        [self initViews];
    }
    return self;
}

- (void)initViews{

    [[UIApplication sharedApplication].keyWindow addSubview:self];
    [self mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo([UIApplication sharedApplication].keyWindow);
    }];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick:)];
    [self addGestureRecognizer:tap];
    
    self.mainView = [[UIView alloc] init];
    self.mainView.backgroundColor = kHexColor(0xE8E8EA);
    NSInteger count = self.titleArray.count;
    CGFloat tempHeight = blockH + bottomH +count*(blockH + gap) - gap;
    [self addSubview:self.mainView];
    [self.mainView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.equalTo(self);
        make.bottom.equalTo(self.mas_bottom).offset(tempHeight);
        make.height.mas_equalTo(tempHeight);
    }];
    
    // 取消按钮
    UIButton *cancelButton = [self createButtonWithTitle:@"取消"];
    [self.mainView addSubview:cancelButton];
    [cancelButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.bottom.equalTo(self.mainView);
        make.height.mas_equalTo(blockH);
    }];
    
    [self.titleArray enumerateObjectsUsingBlock:^(NSString *  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        UIButton *tempButton = [self createButtonWithTitle:obj];
        tempButton.tag = 100 + idx;
        [self.mainView addSubview:tempButton];
        [tempButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.right.equalTo(self.mainView);
            make.height.mas_equalTo(blockH);
            make.bottom.equalTo(cancelButton.mas_top).offset(-(bottomH + (gap + blockH)*idx));
        }];
    }];
    
    [self layoutIfNeeded];
}

// 按钮生成器
- (UIButton *)createButtonWithTitle:(NSString *)title {
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.backgroundColor = [UIColor whiteColor];
    [button setTitle:title forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonClick:) forControlEvents:(UIControlEventTouchUpInside)];
    [button setTitleColor:[UIColor blackColor] forState:(UIControlStateNormal)];
    button.titleLabel.font = [UIFont systemFontOfSize:18];
    return button;
}

// 显示
- (void)show{
    // 动画 背景色、main浮现
    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3];
        [self.mainView mas_updateConstraints:^(MASConstraintMaker *make) {
            make.bottom.equalTo(self.mas_bottom);
        }];
        [self layoutIfNeeded];
    } completion:^(BOOL finished) {

    }];
    
}

#pragma mark -- action

- (void)buttonClick:(UIButton *)sender{
    
    // 动画 
    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0];
        [self.mainView mas_updateConstraints:^(MASConstraintMaker *make) {
            make.bottom.equalTo(self.mas_bottom).offset(blockH + bottomH +self.titleArray.count*(blockH + gap) - gap);
        }];
        [self layoutIfNeeded];
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
    }];
    // block回调
    if (self.finish) {
        self.finish(sender.tag - 100);
    }
}

- (void)tapClick:(UITapGestureRecognizer *)tap{
    CGPoint point = [tap locationInView:tap.view];
    if (!CGRectContainsPoint(self.mainView.frame, point)) {
        // 动画 
        [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
            self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0];
            [self.mainView mas_updateConstraints:^(MASConstraintMaker *make) {
                make.bottom.equalTo(self.mas_bottom).offset(blockH + bottomH +self.titleArray.count*(blockH + gap) - gap);
            }];
            [self layoutIfNeeded];
        } completion:^(BOOL finished) {
            [self removeFromSuperview];
        }];
    }
}

注:
点击事件通过block回调处理

相关文章

网友评论

      本文标题:仿微信Alert样式

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