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

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

记录学习--自定义提醒框(OC)_第1张图片
新建UIView控件
#import 
/** 定义返回结果的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))