iOS自定义提示弹出框实现类似UIAlertView的效果

开发技术 作者: 2024-08-16 08:15:01
最近在学习iOS开发,在牛刀小试的时候发现系统的UIAlertView有点不喜欢,然后就自己自定义了一个UIAlertView,基本上实现了系统的UIAlertView,可以根据项目的需求修改UIAlertView的颜色。有需要的朋友们可以参考借鉴,也可以多多指导,下面来一起看看吧。

首先来看看实现的效果图

下面话不多说,以下是实现的示例代码

typedef void(^AlertResult)(NSInteger index);

@interface XLAlertView : UIView

@property (nonatomic,copy) AlertResult resultIndex;

  • (instancetype)initWithTitle:(NSString )title message:(NSString )message sureBtn:(NSString )sureTitle cancleBtn:(NSString )cancleTitle;

  • (void)showXLAlertView;

@end

///alertView 宽

define AlertW 280

///各个栏目之间的距离

define XLSpace 10.0

@interface XLAlertView()

//弹窗
@property (nonatomic,retain) UIView alertView;
//title
@property (nonatomic,retain) UILabel
titleLbl;
//内容
@property (nonatomic,retain) UILabel msgLbl;
//确认按钮
@property (nonatomic,retain) UIButton
sureBtn;
//取消按钮
@property (nonatomic,retain) UIButton cancleBtn;
//横线线
@property (nonatomic,retain) UIView
lineView;
//竖线
@property (nonatomic,retain) UIView *verLineView;

@end

@implementation XLAlertView

  • (instancetype)initWithTitle:(NSString )title message:(NSString )message sureBtn:(NSString )sureTitle cancleBtn:(NSString )cancleTitle
    {
    if (self == [super init]) {

    self.frame = [UIScreen mainScreen].bounds;

    self.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.6];

    self.alertView = [[UIView alloc] init];
    self.alertView.backgroundColor = [UIColor whiteColor];
    self.alertView.layer.cornerRadius = 5.0;

    self.alertView.frame = CGRectMake(0,AlertW,100);
    self.alertView.layer.position = self.center;

    if (title) {

    self.titleLbl = [self GetAdaptiveLable:CGRectMake(2*XLSpace,2*XLSpace,AlertW-4*XLSpace,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((AlertW-titleW)/2,titleW,titleH);

    }
    if (message) {

    self.msgLbl = [self GetAdaptiveLable:CGRectMake(XLSpace,CGRectGetMaxY(self.titleLbl.frame)+XLSpace,AlertW-2*XLSpace,20) AndText:message andIsTitle:NO];
    self.msgLbl.textAlignment = NSTextAlignmentCenter;
    
    [self.alertView addSubview:self.msgLbl];
    
    CGFloat msgW = self.msgLbl.bounds.size.width;
    CGFloat msgH = self.msgLbl.bounds.size.height;
    
    self.msgLbl.frame = self.titleLbl?CGRectMake((AlertW-msgW)/2,msgW,msgH):CGRectMake((AlertW-msgW)/2,msgH);

    }

    self.lineView = [[UIView alloc] init];
    self.lineView.frame = self.msgLbl?CGRectMake(0,CGRectGetMaxY(self.msgLbl.frame)+2XLSpace,1):CGRectMake(0,CGRectGetMaxY(self.titleLbl.frame)+2XLSpace,1);
    self.lineView.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.6];
    [self.alertView addSubview:self.lineView];

    //两个按钮
    if (cancleTitle && sureTitle) {

    self.cancleBtn = [UIButton buttonWithType:UIButtonTypeSystem];
    self.cancleBtn.frame = CGRectMake(0,CGRectGetMaxY(self.lineView.frame),(AlertW-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:cancleTitle forState:UIControlStateNormal];
    //[self.cancleBtn setTitleColor:[UIColor grayColor] 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];

    }

    if (cancleTitle && sureTitle) {
    self.verLineView = [[UIView alloc] init];
    self.verLineView.frame = CGRectMake(CGRectGetMaxX(self.cancleBtn.frame),1,40);
    self.verLineView.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.6];
    [self.alertView addSubview:self.verLineView];
    }

    if(sureTitle && cancleTitle){

    self.sureBtn = [UIButton buttonWithType:UIButtonTypeSystem];
    self.sureBtn.frame = CGRectMake(CGRectGetMaxX(self.verLineView.frame),(AlertW-1)/2+1,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:sureTitle forState:UIControlStateNormal];
    //[self.sureBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    self.sureBtn.tag = 2;
    [self.sureBtn addTarget:self action:@selector(buttonEvent:) forControlEvents:UIControlEventTouchUpInside];
    
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.sureBtn.bounds byRoundingCorners: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];

    }

    //只有取消按钮
    if (cancleTitle && !sureTitle) {

    self.cancleBtn = [UIButton buttonWithType:UIButtonTypeSystem];
    self.cancleBtn.frame = CGRectMake(0,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:cancleTitle forState:UIControlStateNormal];
    //[self.cancleBtn setTitleColor:[UIColor grayColor] 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(sureTitle && !cancleTitle){

    self.sureBtn = [UIButton buttonWithType:UIButtonTypeSystem];
    self.sureBtn.frame = CGRectMake(0,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:sureTitle forState:UIControlStateNormal];
    //[self.sureBtn setTitleColor:[UIColor grayColor] 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 = cancleTitle?CGRectGetMaxY(self.cancleBtn.frame):CGRectGetMaxY(self.sureBtn.frame);
    self.alertView.frame = CGRectMake(0,alertHeight);
    self.alertView.layer.position = self.center;

    [self addSubview:self.alertView];
    }

    return self;
    }

pragma mark - 弹出 -

  • (void)showXLAlertView
    {
    UIWindow *rootWindow = [UIApplication sharedApplication].keyWindow;
    [rootWindow addSubview:self];
    [self creatShowAnimation];
    }

  • (void)creatShowAnimation
    {
    self.alertView.layer.position = self.center;
    self.alertView.transform = CGAffineTransformMakeScale(0.90,0.90);
    [UIView animateWithDuration:0.25 delay:0 usingSpringWithDamping:0.8 initialSpringVelocity:1 options:UIViewAnimationOptionCurveLinear animations:^{
    self.alertView.transform = CGAffineTransformMakeScale(1.0,1.0);
    } completion:^(BOOL finished) {
    }];
    }

pragma mark - 回调 -设置只有2 -- > 确定才回调

  • (void)buttonEvent:(UIButton *)sender
    {
    if (sender.tag == 2) {
    if (self.resultIndex) {
    self.resultIndex(sender.tag);
    }
    }
    [self removeFromSuperview];
    }

-(UILabel )GetAdaptiveLable:(CGRect)rect AndText:(NSString )contentStr andIsTitle:(BOOL)isTitle
{
UILabel *contentLbl = [[UILabel alloc] initWithFrame:rect];
contentLbl.numberOfLines = 0;
contentLbl.text = contentStr;
contentLbl.textAlignment = NSTextAlignmentCenter;
if (isTitle) {
contentLbl.font = [UIFont boldSystemFontOfSize:16.0];
}else{
contentLbl.font = [UIFont systemFontOfSize:14.0];
}

NSMutableAttributedString mAttrStr = [[NSMutableAttributedString alloc] initWithString:contentStr];
NSMutableParagraphStyle
mParaStyle = [[NSMutableParagraphStyle alloc] init];
mParaStyle.lineBreakMode = NSLineBreakByCharWrapping;
[mParaStyle setLineSpacing:3.0];
[mAttrStr addAttribute:NSParagraphStyleAttributeName value:mParaStyle range:NSMakeRange(0,[contentStr length])];
[contentLbl setAttributedText:mAttrStr];
[contentLbl sizeToFit];

return contentLbl;
}

-(UIImage )imageWithColor:(UIColor )color
{
CGRect rect = CGRectMake(0.0f,0.0f,1.0f,1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context,[color CGColor]);
CGContextFillRect(context,rect);
UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return theImage;
}

@end

在需要使用的地方直接调用

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位iOS开发们能有所帮助,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持。

原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_63107.html