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

5年以前  |  阅读数:1082 次  |  编程语言:PHP 

首先来看看实现的效果图

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


    #import <UIKit/UIKit.h>

    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

    #import "XLAlertView.h"

    ///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, 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, 2*XLSpace, 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, CGRectGetMaxY(self.titleLbl.frame)+XLSpace, msgW, msgH):CGRectMake((AlertW-msgW)/2, 2*XLSpace, msgW, msgH);
        }

        self.lineView = [[UIView alloc] init];
        self.lineView.frame = self.msgLbl?CGRectMake(0, CGRectGetMaxY(self.msgLbl.frame)+2*XLSpace, AlertW, 1):CGRectMake(0, CGRectGetMaxY(self.titleLbl.frame)+2*XLSpace, AlertW, 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), CGRectGetMaxY(self.lineView.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), CGRectGetMaxY(self.lineView.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, CGRectGetMaxY(self.lineView.frame), AlertW, 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, CGRectGetMaxY(self.lineView.frame), AlertW, 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, 0, AlertW, 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

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


    XLAlertView *xlAlertView = [[XLAlertView alloc] initWithTitle:@"自定义UIAlertView" message:@"不喜勿喷,大神多多指导。不胜感激" sureBtn:@"确认" cancleBtn:@"取消"];
    xlAlertView.resultIndex = ^(NSInteger index){
    //回调---处理一系列动作
    };
    [xlAlertView showXLAlertView];

总结

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

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例