美文网首页
记录学习--自定义提醒框(OC)

记录学习--自定义提醒框(OC)

作者: 乂滥好人 | 来源:发表于2017-01-09 14:35 被阅读55次

    仅做学习使用,不做任何用途

    新建UIView控件
    #import <UIKit/UIKit.h>
    /** 定义返回结果的Block */
    typedef void(^AlertResult)(NSInteger index);
    
    @interface customAlertView : UIView
    /** 确定按钮背景色 */
    @property (strong, nonatomic) UIColor *sureButBgColor;
    /** 确定按钮文字色 */
    @property (strong, nonatomic) UIColor *sureButTextColor;
    /** 点击的结果Block */
    @property (nonatomic,copy) AlertResult resultIndex;
    
    
    /** 初始化 
     * title: 提示框标题
     * message: 消息内容
     * sureButTitle: 确定按钮文字
     * cancleButTitle: 取消按钮文字
     */
    - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message sureButtonTitle:(NSString *)sureButTitle cancleButton:(NSString *)cancleButTitle;
    
    /* 显示提醒框 */
    - (void)show;
    
    @end
    
    .M
    #import "customAlertView.h"
    /* AlertView的宽度 */
    #define kAlertViewW 280
    /* 间距 */
    #define kSpace 10.0
    
    @interface customAlertView()
    /** 弹窗 */
    @property (retain, nonatomic) UIView *alertView;
    /** 标题 */
    @property (retain, nonatomic) UILabel *titleLbl;
    /** 内容 */
    @property (retain, nonatomic) UILabel *mssageLbl;
    /** 确认按钮 */
    @property(nonatomic,retain) UIButton *sureBtn;
    /** 取消按钮 */
    @property(nonatomic,retain) UIButton *cancleBtn;
    /** 横线 */
    @property(nonatomic,retain) UIView *hLineView;
    /** 竖线 */
    @property(nonatomic,retain) UIView *vLineView;
    
    @end
    
    
    @implementation customAlertView
    
    #pragma mark- 懒加载
    - (UIView *)alertView
    {
        if (!_alertView) {
            _alertView = [[UIView alloc] init];
            _alertView.backgroundColor = [UIColor whiteColor];
            _alertView.layer.cornerRadius = 10.0;
        }
        return _alertView;
    }
    
    - (UIView *)hLineView
    {
        if (!_hLineView) {
            _hLineView = [[UIView alloc] init];
            CGRect lineFrame1 = CGRectMake(0, CGRectGetMaxY(self.mssageLbl.frame) + 2 * kSpace, kAlertViewW, 1);
            CGRect lineFrame2 = CGRectMake(0, CGRectGetMaxY(self.titleLbl.frame)+ 2 * kSpace, kAlertViewW, 1);
            _hLineView.frame = self.mssageLbl ? lineFrame1 : lineFrame2;
            _hLineView.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.6];
        }
        return _hLineView;
    }
    
    - (UIView *)vLineView
    {
        if (!_vLineView) {
            _vLineView = [[UIView alloc] init];
            _vLineView.frame = CGRectMake(CGRectGetMaxX(self.cancleBtn.frame), CGRectGetMaxY(self.hLineView.frame), 1, 40);
            _vLineView.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.6];
        }
        return _vLineView;
    }
    
    #pragma mark- 背景图片颜色
    - (UIImage *)imageWithColor:(UIColor *)color
    {
        CGRect rect = CGRectMake(0, 0, 1, 1);
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [color CGColor]);
        CGContextFillRect(context, rect);
        UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return theImage;
    }
    
    #pragma mark - 重写set方法
    - (void)setSureButBgColor:(UIColor *)sureButBgColor
    {
        _sureButBgColor = sureButBgColor;
        self.sureBtn.backgroundColor = sureButBgColor;
    }
    
    - (void)setSureButTextColor:(UIColor *)sureButTextColor
    {
         _sureButTextColor = sureButTextColor;
        [self.sureBtn setTitleColor:sureButTextColor forState:UIControlStateNormal];
    }
    
    
    #pragma mark - 初始化
    - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message sureButtonTitle:(NSString *)sureButTitle cancleButton:(NSString *)cancleButTitle
    {
        if (self == [super init]) {
            self.frame = [UIScreen mainScreen].bounds;
            self.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.6];
            
            // 确定按钮 默认颜色
            self.sureButTextColor = [UIColor blueColor];
            self.sureButBgColor = [UIColor whiteColor];
            
            // 如果有标题
            if (title) {
                self.titleLbl = [self GetAdaptiveLabel:CGRectMake(2 * kSpace, 2 * kSpace, kAlertViewW - 4 * kSpace, 20) andText:title andIsTitle:YES];
                self.titleLbl.textAlignment = NSTextAlignmentCenter;
                [self.alertView addSubview:self.titleLbl];
                
                CGFloat titleW = self.titleLbl.bounds.size.width;
                CGFloat titleH = self.titleLbl.bounds.size.height;
                self.titleLbl.frame = CGRectMake((kAlertViewW - titleW) / 2, 2 * kSpace, titleW, titleH);
            }
            
            // 如果有内容
            if (message) {
                CGRect frames = CGRectMake(kSpace, CGRectGetMaxX(self.titleLbl.frame) + kSpace, kAlertViewW - 2 * kSpace, 20);
                self.mssageLbl = [self GetAdaptiveLabel:frames andText:message andIsTitle:NO];
                self.mssageLbl.textAlignment = NSTextAlignmentCenter;
                [self.alertView addSubview:self.mssageLbl];
                
                CGFloat msgW = self.mssageLbl.bounds.size.width;
                CGFloat msgH = self.mssageLbl.bounds.size.height;
                CGRect msgFrame1 = CGRectMake((kAlertViewW - msgW) / 2, CGRectGetMaxY(self.titleLbl.frame) + kSpace, msgW, msgH);
                CGRect msgFrame2 =  CGRectMake((kAlertViewW - msgW) / 2, 2 * kSpace, msgW, msgH);
                self.mssageLbl.frame = self.titleLbl ? msgFrame1 : msgFrame2;
            }
            
            // 添加横线
            [self.alertView addSubview:self.hLineView];
            
            // 如果有两个按钮
            if (cancleButTitle && sureButTitle) {
                // ---------------------------------取消按钮------------------------------------
                self.cancleBtn = [UIButton buttonWithType:UIButtonTypeSystem];
                self.cancleBtn.frame = CGRectMake(0, CGRectGetMaxY(self.hLineView.frame), (kAlertViewW - 1) / 2, 40);
                [self.cancleBtn setBackgroundImage:[self imageWithColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.2]] forState:UIControlStateNormal];
                [self.cancleBtn setBackgroundImage:[self imageWithColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.2]] forState:UIControlStateSelected];
                [self.cancleBtn setTitle:cancleButTitle forState:UIControlStateNormal];
                self.cancleBtn.tag = 1;
                [self.cancleBtn addTarget:self action:@selector(buttonEvent:) forControlEvents:UIControlEventTouchUpInside];
                
                UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.cancleBtn.bounds byRoundingCorners:UIRectCornerBottomLeft cornerRadii:CGSizeMake(5.0, 5.0)];
                CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
                maskLayer.frame = self.cancleBtn.bounds;
                maskLayer.path = maskPath.CGPath;
                self.cancleBtn.layer.mask = maskLayer;
                [self.alertView addSubview:self.cancleBtn];
                // 添加竖线
                [self.alertView addSubview:self.vLineView];
                
                // ---------------------------------确定按钮------------------------------------
                self.sureBtn = [UIButton buttonWithType:UIButtonTypeSystem];
                self.sureBtn.frame = CGRectMake(CGRectGetMaxX(self.vLineView.frame), CGRectGetMaxY(self.hLineView.frame), (kAlertViewW - 1) / 2 + 1, 40);
                [self.sureBtn setTitle:sureButTitle forState:UIControlStateNormal];
                self.sureBtn.tag = 2;
                [self.sureBtn addTarget:self action:@selector(buttonEvent:) forControlEvents:UIControlEventTouchUpInside];
                
                UIBezierPath *maskPath1 = [UIBezierPath bezierPathWithRoundedRect:self.sureBtn.bounds byRoundingCorners:UIRectCornerBottomRight cornerRadii:CGSizeMake(5.0, 5.0)];
                CAShapeLayer *maskLayer1 = [[CAShapeLayer alloc] init];
                maskLayer1.frame = self.sureBtn.bounds;
                maskLayer1.path = maskPath1.CGPath;
                self.sureBtn.layer.mask = maskLayer1;
                [self.alertView addSubview:self.sureBtn];
            }
            
            // 只有取消按钮
            if (cancleButTitle && !sureButTitle) {
                self.cancleBtn = [UIButton buttonWithType:UIButtonTypeSystem];
                self.cancleBtn.frame = CGRectMake(0, CGRectGetMaxY(self.hLineView.frame), kAlertViewW, 40);
                [self.cancleBtn setBackgroundImage:[self imageWithColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.2]] forState:UIControlStateNormal];
                [self.cancleBtn setBackgroundImage:[self imageWithColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.2]] forState:UIControlStateSelected];
                [self.cancleBtn setTitle:cancleButTitle forState:UIControlStateNormal];
                self.cancleBtn.tag = 1;
                [self.cancleBtn addTarget:self action:@selector(buttonEvent:) forControlEvents:UIControlEventTouchUpInside];
                
                UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.cancleBtn.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(5.0, 5.0)];
                CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
                maskLayer.frame = self.cancleBtn.bounds;
                maskLayer.path = maskPath.CGPath;
                self.cancleBtn.layer.mask = maskLayer;
                [self.alertView addSubview:self.cancleBtn];
            }
            
            // 只有确定按钮
            if(sureButTitle && !cancleButTitle){
                self.sureBtn = [UIButton buttonWithType:UIButtonTypeSystem];
                self.sureBtn.frame = CGRectMake(0, CGRectGetMaxY(self.hLineView.frame), kAlertViewW, 40);
                [self.sureBtn setBackgroundImage:[self imageWithColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.2]] forState:UIControlStateNormal];
                [self.sureBtn setBackgroundImage:[self imageWithColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.2]] forState:UIControlStateSelected];
                [self.sureBtn setTitle:sureButTitle forState:UIControlStateNormal];
                self.sureBtn.tag = 2;
                [self.sureBtn addTarget:self action:@selector(buttonEvent:) forControlEvents:UIControlEventTouchUpInside];
                
                UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.sureBtn.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(5.0, 5.0)];
                CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
                maskLayer.frame = self.sureBtn.bounds;
                maskLayer.path = maskPath.CGPath;
                self.sureBtn.layer.mask = maskLayer;
                [self.alertView addSubview:self.sureBtn];
            }
            
            // 计算内容文字的高度来确定提示框的高度
            CGFloat alertHeight = cancleButTitle ? CGRectGetMaxY(self.cancleBtn.frame):CGRectGetMaxY(self.sureBtn.frame);
            self.alertView.frame = CGRectMake(0, 0, kAlertViewW, alertHeight);
            self.alertView.layer.position = self.center;
            [self addSubview:self.alertView];
        }
        return self;
    }
    
    #pragma mark - 显示
    - (void)show
    {
        UIWindow *rootWindow = [UIApplication sharedApplication].keyWindow;
        [rootWindow addSubview:self];
        [self creatShowAnimation];
    }
    
    /** 创建显示框的动画 */
    - (void)creatShowAnimation
    {
        self.alertView.layer.position = self.center;
        self.alertView.transform = CGAffineTransformMakeScale(0.20, 0.20);
        [UIView animateWithDuration:0.35 delay:0.02 usingSpringWithDamping:0.4 initialSpringVelocity:10 options:UIViewAnimationOptionCurveLinear animations:^{
            self.alertView.transform = CGAffineTransformMakeScale(1.0, 1.0);
        } completion:^(BOOL finished) {
            
        }];
    }
    
    #pragma mark - 按钮点击事件
    - (void)buttonEvent:(UIButton *)sender
    {
        // 回调
        if (self.resultIndex) {
            self.resultIndex(sender.tag);
        }
        // 隐藏视图动画
        [UIView animateWithDuration:0.25 animations:^{
            self.alertView.transform = CGAffineTransformMakeScale(0.0001, 0.0001);
        } completion:^(BOOL finished) {
            [self removeFromSuperview];
        }];
    }
    
    
    #pragma mark- 获取内容自适应Label标签
    - (UILabel *)GetAdaptiveLabel:(CGRect)rect andText:(NSString *)contentStr andIsTitle:(BOOL)isTitle
    {
        UILabel *contentLb = [[UILabel alloc] initWithFrame:rect];
        contentLb.numberOfLines = 0;
        contentLb.text = contentStr;
        contentLb.textAlignment = NSTextAlignmentCenter;
        
        if (isTitle) {
            contentLb.font = [UIFont boldSystemFontOfSize:16.0];
        }else{
            contentLb.font = [UIFont boldSystemFontOfSize:14.0];
        }
        NSMutableAttributedString *mutStr = [[NSMutableAttributedString alloc] initWithString:contentStr];
        // 设置段落风格属性
        NSMutableParagraphStyle *mutParaStyle = [[NSMutableParagraphStyle alloc] init];
        // 设置文字省略方式
        mutParaStyle.lineBreakMode = NSLineBreakByCharWrapping;
        // 设置字体的行间距
        mutParaStyle.lineSpacing = 3.0;
        [mutStr addAttribute:NSParagraphStyleAttributeName value:mutParaStyle range:NSMakeRange(0, [contentStr length])];
        [contentLb setAttributedText:mutStr];
        [contentLb sizeToFit];
        return contentLb;
    }
    @end
    
    包含头文件,VC调用
    - (IBAction)buttonClick:(UIButton *)sender {
        switch (sender.tag) {
            case 10:{
                /** 正常 */
                customAlertView *alertView = [[customAlertView alloc] initWithTitle:@"我是标题" message:@"Copyright © 2017年 watering. All rights reserved." sureButtonTitle:@"好的" cancleButton:@"取消"];
                alertView.sureButBgColor = [UIColor lightGrayColor];
                alertView.sureButTextColor = [UIColor redColor];
                alertView.resultIndex = ^(NSInteger index) {
                    NSLog(@"%ld",index);
                };
                [alertView show];
            }
                break;
            case 20:{
                /** 没有标题 */
                customAlertView *alertView = [[customAlertView alloc] initWithTitle:nil message:@"Copyright © 2017年 watering. All rights reserved." sureButtonTitle:@"好的" cancleButton:@"取消"];
                alertView.sureButBgColor = [UIColor redColor];
                alertView.sureButTextColor = [UIColor whiteColor];
                alertView.resultIndex = ^(NSInteger index) {
                    NSLog(@"%ld",index);
                };
                [alertView show];
            }
                break;
            case 30:{
                /** 没有确定*/
                customAlertView *alertView = [[customAlertView alloc] initWithTitle:@"我是标题" message:@"Copyright © 2017年 watering. All rights reserved.Copyright © 2017年 watering. All rights reserved.Copyright © 2017年 watering. All rights reserved.Copyright © 2017年 watering. All rights reserved." sureButtonTitle:nil cancleButton:@"取消"];
                alertView.resultIndex = ^(NSInteger index) {
                    NSLog(@"%ld",index);
                };
                [alertView show];
            }
                break;
            case 40:{
                /** 没有取消 */
                customAlertView *alertView = [[customAlertView alloc] initWithTitle:@"我是标题" message:@"Copyright © 2017年 watering. All rights reserved.Created \n by watering on 17/1/5." sureButtonTitle:@"好的" cancleButton:nil];
                alertView.sureButBgColor = [UIColor purpleColor];
                alertView.sureButTextColor = [UIColor whiteColor];
                alertView.resultIndex = ^(NSInteger index) {
                    NSLog(@"%ld",index);
                };
                [alertView show];
            }
                break;
                
            default:
                break;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:记录学习--自定义提醒框(OC)

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