iOS自定义alertView提示框

xiaoxiao2021-02-28  79

iOS UIKit框架下自带的UIAlertView在功能或者美观上,有的时候并不能满足我们的开发需求,这个时候,就可以自定义alertView。我在这里写了一个简单的自定义alertView的Demo,希望能帮助到iOS开发的小伙们。话不多说,直接上代码:

在。h里:

#import <UIKit/UIKit.h> typedef void(^alertClick)(NSInteger index); @interface SLAlertView : UIView @property (nonatomic,copy) alertClick clickIndex; - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message sureBtn:(NSString *)sureTitle cancleBtn:(NSString *)cancleTitle; - (void)show; @end

在。m里:

#import "SLAlertView.h" #define alertViewWidth 280 //alertView 宽 #define edge 10.0 //各个栏目之间的距离 @interface SLAlertView () @property (nonatomic,retain) UIView *alertView;//弹窗 @property (nonatomic,retain) UILabel *titleLbl;//title @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 SLAlertView - (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 = 8.0;                  self.alertView.frame = CGRectMake(0, 0, alertViewWidth, 100);         self.alertView.layer.position = self.center;                  if (title) {                          self.titleLbl = [self GetAdaptiveLable:CGRectMake(2*edge, 2*edge, alertViewWidth-4*edge, 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((alertViewWidth-titleW)/2, 2*edge, titleW, titleH);                      }         if (message) {                          self.msgLbl = [self GetAdaptiveLable:CGRectMake(edge, CGRectGetMaxY(self.titleLbl.frame)+edge, alertViewWidth-2*edge, 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((alertViewWidth-msgW)/2, CGRectGetMaxY(self.titleLbl.frame)+edge, msgW, msgH):CGRectMake((alertViewWidth-msgW)/2, 2*edge, msgW, msgH);         }                  self.lineView = [[UIView alloc] init];         self.lineView.frame = self.msgLbl?CGRectMake(0, CGRectGetMaxY(self.msgLbl.frame)+2*edge, alertViewWidth, 1):CGRectMake(0, CGRectGetMaxY(self.titleLbl.frame)+2*edge, alertViewWidth, 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), (alertViewWidth-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), (alertViewWidth-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), alertViewWidth, 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), alertViewWidth, 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, alertViewWidth, alertHeight);         self.alertView.layer.position = self.center;                  [self addSubview:self.alertView];     }          return self; } //alertView弹出展示 - (void)show{

    //iOS8之后,[UIApplicationsharedApplication].windows有两个,第一个为UIWindow,是程序主要的keyWindow;第二个为UITextEffectsWindow,是键盘所在的window,当我们要覆盖住键盘时得在这个window上addSubview。

    [[[UIApplication sharedApplication].windows lastObject] addSubview:self];     [self showAnimation]; } #pragma mark - Animation  提示框弹出时的动画效果

- (void)showAnimation {     CAKeyframeAnimation *alertViewshowAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];     alertViewshowAnimation .duration = 0.4;     alertViewshowAnimation .values = @[[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.01f, 0.01f, 1.0f)],                                        [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1f, 1.1f, 1.0f)],                                        [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9f, 0.9f, 1.0f)],                                        [NSValue valueWithCATransform3D:CATransform3DIdentity]];     alertViewshowAnimation.keyTimes = @[@0.2f, @0.5f, @0.75f, @1.0f];     alertViewshowAnimation.timingFunctions = @[[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],                                                [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],                                                [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];     [_alertView.layer addAnimation:alertViewshowAnimation forKey:nil]; } #pragma mark - alertView按钮点击回调  - (void)buttonEvent:(UIButton *)sender {     if (sender.tag == 2) {         if (self.clickIndex) {             self.clickIndex(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

在你需要显示alert的时候:

SLAlertView *alert = [[SLAlertView alloc]initWithTitle:@"!!!" message:@"确定要删除吗?" sureBtn:@"我意已决" cancleBtn:@"我在想想"];

//点击按钮之后的回调

alert.resultIndex = ^(NSInteger index){             NSLog(@"%d",index);         };

[alert show]; 以上就是自定义的一个简单的demo,你可以参照该demo,在此基础上进行修改,以达到你要的效果。

转载请注明原文地址: https://www.6miu.com/read-55635.html

最新回复(0)