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

  • 相关阅读:
    Python 学习笔记 11.模块(Module)
    Python 学习笔记 8.引用(Reference)
    Python 学习笔记 9.函数(Function)
    Python 学习笔记 6.List和Tuple
    Python 学习笔记 4.if 表达式
    Python 学习笔记 2.自省
    Python 学习笔记 3.简单类型
    Python 学习笔记 7.Dictionary
    Python 学习笔记 5.对象驻留
    Python 学习笔记 10.类(Class)
  • 原文地址:https://www.cnblogs.com/yyt-hehe-yyt/p/5414861.html
Copyright © 2011-2022 走看看