zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    树状数组——求和问题题解
    java 基础01
    java jdk 配置
    一位资深程序员大牛给予Java初学者的学习路线建议
    汇编 OD 标志位 置位相关指令
    汇编 SETG,SETL ,SETGE, SETLE指令
    汇编 指令lodsb,lodsw,lodsd
    汇编 STOSB, STOSW, STOSD指令
    汇编 LOOP,LOOPD指令
    汇编 STD和CLD指令
  • 原文地址:https://www.cnblogs.com/yyt-hehe-yyt/p/5414861.html
Copyright © 2011-2022 走看看