仅做学习使用,不做任何用途
新建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;
}
}