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

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

新建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;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,471评论 25 707
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 1,287评论 0 3
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 4,682评论 0 7
  • 忙碌的时光是短暂的,无聊的时刻是漫长的;认真做事的时候光阴似箭,无所事事的时候度日如年;开始做事和决定执行,是两码...
    cc08阅读 267评论 0 0
  • test
    cayoh阅读 81评论 0 0