iOS开发——自定义AlertView

  自定义的AlertView,可以选择出现的动画方式,正文信息高度自动变化,特意做了几个可以对比。没啥难点,直接上代码,一看就懂。

  1.在YYTAlertView.h文件中

//

//  YYTAlertView.h

//  Demo-自定义alertView

//

//  Created by yyt on 16/4/19.

//  Copyright © 2016年 yyt. All rights reserved.

//

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSInteger , ShowAnimationStyle) {

    AnimationDefault = 0,

    AnimationLeftShake  ,

    AnimationTopShake   ,

    AnimationNO         ,

};

typedef void(^AlertClickIndexBlock)(NSInteger clickIndex);

@interface YYTAlertView : UIView

@property (nonatomic,copy) AlertClickIndexBlock clickBlock;

@property (nonatomic,assign) ShowAnimationStyle animationStyle;

- (instancetype)initWithTitle:(NSString *)title AndMessage:(NSString *)message AndCancelBtnTitle:(NSString *)cancelTitle AndOtherBtnTitle:(NSString *)otherBtnTitle AndClickIndexBlock:(AlertClickIndexBlock)block;

-(void)showAlertView;

@end

  2.在YYTAlertView.m文件中

//

//  YYTAlertView.m

//  Demo-自定义alertView

//

//  Created by yyt on 16/4/19.

//  Copyright © 2016年 yyt. All rights reserved.

//

#import "YYTAlertView.h"

#define MainScreenRect [UIScreen mainScreen].bounds

#define AlertView_W 270.0f

@interface YYTAlertView ()

@property (nonatomic,strong)UIWindow *alertWindow;

@property (nonatomic,strong)UIView *alertView;

@property (nonatomic,strong)UILabel *titleLab;

@property (nonatomic,strong)UILabel *messageLab;

@property (nonatomic,strong)UIButton *cancelBtn;

@property (nonatomic,strong)UIButton *otherBtn;

@end

@implementation YYTAlertView

- (instancetype)initWithTitle:(NSString *)title AndMessage:(NSString *)message AndCancelBtnTitle:(NSString *)cancelTitle AndOtherBtnTitle:(NSString *)otherBtnTitle AndClickIndexBlock:(AlertClickIndexBlock)block{

    if(self=[super init]){

        self.frame = MainScreenRect;

        self.backgroundColor=[UIColor colorWithWhite:.3 alpha:.7];

        

        _alertView=[[UIView alloc] init];

        _alertView.backgroundColor=[UIColor whiteColor];

        _alertView.layer.cornerRadius=6.0;

        _alertView.layer.masksToBounds=YES;

        _alertView.userInteractionEnabled=YES;

        

        if (title) {

            _titleLab=[[UILabel alloc] initWithFrame:CGRectMake(0, 10, AlertView_W, 20)];

            _titleLab.text=title;

            _titleLab.textAlignment=NSTextAlignmentCenter;

            _titleLab.textColor=[UIColor blackColor];

            _titleLab.font=[UIFont systemFontOfSize:17];

        }

        

        _messageLab=[[UILabel alloc] init];

        _messageLab.backgroundColor=[UIColor whiteColor];

        _messageLab.text=message;

        _messageLab.textColor=[UIColor lightGrayColor];

        _messageLab.textAlignment=NSTextAlignmentCenter;

        _messageLab.font=[UIFont systemFontOfSize:14];

        _messageLab.numberOfLines=0;

        CGRect rectOfText = CGRectMake(20, _titleLab.frame.size.height+_titleLab.frame.origin.y+10, AlertView_W-40, 999);

        rectOfText = [_messageLab textRectForBounds:rectOfText limitedToNumberOfLines:0];

        _messageLab.frame = rectOfText;

        

        

        //计算_alertView的高度

        _alertView.frame=CGRectMake(0, 0, AlertView_W, _messageLab.frame.size.height+90);

        _alertView.center=self.center;

        [self addSubview:_alertView];

        

        [_alertView addSubview:_titleLab];

        [_alertView addSubview:_messageLab];

        

        if (cancelTitle) {

            _cancelBtn=[UIButton buttonWithType:UIButtonTypeCustom];

            [_cancelBtn setTitle:cancelTitle forState:UIControlStateNormal];

            [_cancelBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

            [_cancelBtn setBackgroundColor:[UIColor lightGrayColor]];

            _cancelBtn.titleLabel.font=[UIFont systemFontOfSize:15];

            _cancelBtn.layer.cornerRadius=3;

            _cancelBtn.layer.masksToBounds=YES;

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

            [_alertView addSubview:_cancelBtn];

        }

        

        if (otherBtnTitle) {

            _otherBtn=[UIButton buttonWithType:UIButtonTypeCustom];

            [_otherBtn setTitle:otherBtnTitle forState:UIControlStateNormal];

            [_otherBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

            _otherBtn.titleLabel.font=[UIFont systemFontOfSize:15];

            _otherBtn.layer.cornerRadius=3;

            _otherBtn.layer.masksToBounds=YES;

            [_otherBtn setBackgroundColor:[UIColor redColor]];

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

            [_alertView addSubview:_otherBtn];

        }

        

        CGFloat btnLeftSpace = 40;//btn到左边距

        CGFloat btn_y = _alertView.frame.size.height-40;

        if (cancelTitle && !otherBtnTitle) {

            _cancelBtn.tag=0;

            _cancelBtn.frame=CGRectMake(btnLeftSpace, btn_y, AlertView_W-btnLeftSpace*2, 30);

        }else if (!cancelTitle && otherBtnTitle){

            _otherBtn.tag=0;

            _otherBtn.frame=CGRectMake(btnLeftSpace, btn_y, AlertView_W-btnLeftSpace*2, 30);

        }else if (cancelTitle && otherBtnTitle){

            _cancelBtn.tag=0;

            _otherBtn.tag=1;

            CGFloat btnSpace = 20;//两个btn之间的间距

            CGFloat btn_w =(AlertView_W-btnLeftSpace*2-btnSpace)/2;

            _cancelBtn.frame=CGRectMake(btnLeftSpace, btn_y, btn_w, 30);

            _otherBtn.frame=CGRectMake(_alertView.frame.size.width-btn_w-btnLeftSpace, btn_y, btn_w, 30);

        }

        

        self.clickBlock=block;

        

    }

    return self;

}

-(void)btnClick:(UIButton *)btn{

    if (self.clickBlock) {

        self.clickBlock(btn.tag);

    }

    

    [self dismissAlertView];

}

-(void)showAlertView{

    _alertWindow=[[UIWindow alloc] initWithFrame:MainScreenRect];

    _alertWindow.windowLevel=UIWindowLevelAlert;

    [_alertWindow becomeKeyWindow];

    [_alertWindow makeKeyAndVisible];

    

    [_alertWindow addSubview:self];

    

    [self setShowAnimation];

}

-(void)dismissAlertView{

    [self removeFromSuperview];

    [_alertWindow resignKeyWindow];

}

-(void)setShowAnimation{

    

    switch (_animationStyle) {

            

        case AnimationDefault:

        {

            [UIView animateWithDuration:0 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{

                [_alertView.layer setValue:@(0) forKeyPath:@"transform.scale"];

            } completion:^(BOOL finished) {

                [UIView animateWithDuration:0.23 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{

                    [_alertView.layer setValue:@(1.2) forKeyPath:@"transform.scale"];

                } completion:^(BOOL finished) {

                    [UIView animateWithDuration:0.09 delay:0.02 options:UIViewAnimationOptionCurveEaseInOut animations:^{

                        [_alertView.layer setValue:@(.9) forKeyPath:@"transform.scale"];

                    } completion:^(BOOL finished) {

                        [UIView animateWithDuration:0.05 delay:0.02 options:UIViewAnimationOptionCurveEaseInOut animations:^{

                            [_alertView.layer setValue:@(1.0) forKeyPath:@"transform.scale"];

                        } completion:^(BOOL finished) {

                            

                        }];

                    }];

                }];

            }];

        }

            break;

            

        case AnimationLeftShake:{

            

            CGPoint startPoint = CGPointMake(-AlertView_W, self.center.y);

            _alertView.layer.position=startPoint;

            

            //damping:阻尼,范围0-1,阻尼越接近于0,弹性效果越明显

            //velocity:弹性复位的速度

            [UIView animateWithDuration:.8 delay:0 usingSpringWithDamping:.5 initialSpringVelocity:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{

                _alertView.layer.position=self.center;

                

            } completion:^(BOOL finished) {

                

            }];

        }

            break;

            

        case AnimationTopShake:{

            

            CGPoint startPoint = CGPointMake(self.center.x, -_alertView.frame.size.height);

            _alertView.layer.position=startPoint;

            

            //damping:阻尼,范围0-1,阻尼越接近于0,弹性效果越明显

            //velocity:弹性复位的速度

            [UIView animateWithDuration:.8 delay:0 usingSpringWithDamping:.5 initialSpringVelocity:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{

                _alertView.layer.position=self.center;

                

            } completion:^(BOOL finished) {

                

            }];

        }

            break;

            

        case AnimationNO:{

            

        }

            break;

            

        default:

            break;

    }

}

-(void)setAnimationStyle:(ShowAnimationStyle)animationStyle{

    _animationStyle=animationStyle;

}

@end

  

  3.在需要的地方调用

//

//  ViewController.m

//  Demo-自定义alertView

//

//  Created by yyt on 16/4/19.

//  Copyright © 2016年 yyt. All rights reserved.

//

#import "ViewController.h"

#import "YYTAlertView.h"

#define klScreenWidth self.view.bounds.size.width

@interface ViewController ()<UIAlertViewDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    

    UIButton *button0 = [UIButton buttonWithType:UIButtonTypeCustom];

    button0.frame = CGRectMake(20, 100, klScreenWidth-40, 40);

    button0.backgroundColor = [UIColor orangeColor];

    [button0 setTitle:@"systemAlertView" forState:UIControlStateNormal];

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

    [self.view addSubview:button0];

    

    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];

    button1.frame = CGRectMake(20, 160, klScreenWidth-40, 40);

    button1.backgroundColor = [UIColor orangeColor];

    [button1 setTitle:@"customAlertView1" forState:UIControlStateNormal];

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

    [self.view addSubview:button1];

    

    UIButton *button2 = [UIButton buttonWithType:UIButtonTypeCustom];

    button2.frame = CGRectMake(20, 220, klScreenWidth-40, 40);

    button2.backgroundColor = [UIColor orangeColor];

    [button2 setTitle:@"customAlertView2" forState:UIControlStateNormal];

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

    [self.view addSubview:button2];

    

    UIButton *button3 = [UIButton buttonWithType:UIButtonTypeCustom];

    button3.frame = CGRectMake(20, 280, klScreenWidth-40, 40);

    button3.backgroundColor = [UIColor orangeColor];

    [button3 setTitle:@"customAlertView3" forState:UIControlStateNormal];

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

    [self.view addSubview:button3];

}

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

    UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"系统的AlertView" message:@"hehe" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];

    [alert show];

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

    NSLog(@"系统alert==%ld",buttonIndex);

}

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

    YYTAlertView *alert=[[YYTAlertView alloc] initWithTitle:@"自定义AlertView1" AndMessage:@"默认缩放出现" AndCancelBtnTitle:@"取消" AndOtherBtnTitle:@"确定" AndClickIndexBlock:^(NSInteger clickIndex) {

        NSLog(@"点击自定义AlertView1====%ld",clickIndex);

    }];

    [alert showAlertView];

}

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

    YYTAlertView *alert=[[YYTAlertView alloc] initWithTitle:@"自定义AlertView2" AndMessage:@"自顶部出现" AndCancelBtnTitle:@"取消" AndOtherBtnTitle:@"确定" AndClickIndexBlock:^(NSInteger clickIndex) {

        NSLog(@"点击自定义AlertView2====%ld",clickIndex);

    }];

    alert.animationStyle = AnimationTopShake;

    [alert showAlertView];

}

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

    YYTAlertView *alert=[[YYTAlertView alloc] initWithTitle:@"自定义AlertView3" AndMessage:@"从左边出现" AndCancelBtnTitle:@"取消" AndOtherBtnTitle:@"确定" AndClickIndexBlock:^(NSInteger clickIndex) {

        NSLog(@"点击自定义AlertView3====%ld",clickIndex);

    }];

    alert.animationStyle = AnimationLeftShake;

    [alert showAlertView];

}

@end

原文地址:https://www.cnblogs.com/yyt-hehe-yyt/p/5414861.html