自定义弹出窗AlertView

本文介绍了一个自定义的 iOS 弹窗视图组件 RMZAlertView,该组件支持设置标题、图标、消息内容及按钮,并提供了丰富的自定义选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//
//  RMZAlertView.h
//  ProjectManageEx
//
//  Created by zhangjian on 16/7/29.
//  Copyright © 2016年 zhangjian. All rights reserved.
//

#import

@protocol RMZAlertViewDelegate;

@interface RMZAlertView : UIView
@property (strong, nonatomic) UIView *contentView;
@property (strong, nonatomic) UIImage *icon;
@property (strong, nonatomic) NSString *title;
@property (strong, nonatomic) NSString *message;
@property (weak, nonatomic) id delegate;


@property (nonatomic) BOOL afterClickIsHidden;


- (instancetype)initWithTitle:(NSString *)title icon:(UIImage *)icon message:(NSString *)message delegate:(id)delegate buttonTitles:(NSString *)buttonTitles, ... NS_REQUIRES_NIL_TERMINATION;


- (void)show;

- (void)hide;

- (void)setTitleColor:(UIColor *)color fontSize:(CGFloat)size;

- (void)setMessageColor:(UIColor *)color fontSize:(CGFloat)size;

- (void)setButtonTitleColor:(UIColor *)color fontSize:(CGFloat)size atIndex:(NSInteger)index;

- (void)setHeaderLineColor:(UIColor *)color ;

@end

@protocol RMZAlertViewDelegate

- (void)alertView:(RMZAlertView *)alertView clickedButAtIndex:(NSInteger)buttonIndex;

@end


//
//  RMZAlertView.m
//  ProjectManageEx
//
//  Created by mac on 16/7/29.
//  Copyright © 2016年 mobei. All rights reserved.
//

#import "RMZAlertView.h"

#define BUTTON_FONT_SIZE 16
#define MARGIN_TOP 20
#define MARGIN_LEFT_LARGE 30
#define MARGIN_LEFT_SMALL 15
#define MARGIN_RIGHT_LARGE 30
#define MARGIN_RIGHT_SMALL 15
#define SPACE_LARGE 20
#define SPACE_SMALL 5
#define MESSAGE_LINE_SPACE 5

@interface RMZAlertView ()

@property (strong, nonatomic) UIView *backgroundView;
@property (strong, nonatomic) UIView *titleView;
@property (strong, nonatomic) UIView *headerLineView;
@property (strong, nonatomic) UIImageView *iconImageView;
@property (strong, nonatomic) UILabel *titleLabel;
@property (strong, nonatomic) UILabel *messageLabel;

@property (strong, nonatomic) NSMutableArray *buttonArray;
@property (strong, nonatomic) NSMutableArray *buttonTitleArray;

@end

CGFloat contentViewWidth;
CGFloat contentViewHeight;

@implementation RMZAlertView


- (instancetype)init {
      if (self = [super initWithFrame:[UIScreen mainScreen].bounds]) {
              self.backgroundColor = [UIColor clearColor];
             
              _backgroundView = [[UIView alloc] initWithFrame:self.frame];
              _backgroundView.backgroundColor = [UIColor blackColor];
              [self addSubview:_backgroundView];
              _backgroundView.userInteractionEnabled = YES;
              UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedCancel)];
              [_backgroundView addGestureRecognizer:tapGesture];
      }
      return self;
}
//普通及带图标的alert
- (instancetype)initWithTitle:(NSString *)title icon:(UIImage *)icon message:(NSString *)message delegate:(id)delegate buttonTitles:(NSString *)buttonTitles, ... {
      if (self = [super initWithFrame:[UIScreen mainScreen].bounds]) {
              _icon = icon;
              _title = title;
              _message = message;
              _delegate = delegate;
              _buttonArray = [NSMutableArray array];
              _buttonTitleArray = [NSMutableArray array];
              self.afterClickIsHidden = YES;
             
              va_list args;
              va_start(args, buttonTitles);
              if (buttonTitles)
              {
                      [_buttonTitleArray addObject:buttonTitles];
                      while (1)
                      {
                              NSString *  otherButtonTitle = va_arg(args, NSString *);
                              if(otherButtonTitle == nil) {
                                      break;
                              } else {
                                      [_buttonTitleArray addObject:otherButtonTitle];
                              }
                      }
              }
              va_end(args);
             
              self.backgroundColor = [UIColor clearColor];
             
              _backgroundView = [[UIView alloc] initWithFrame:self.frame];
              _backgroundView.backgroundColor = [UIColor blackColor];
              [self addSubview:_backgroundView];
              [self initContentView];
      }
      return self;
}

- (void)setContentView:(UIView *)contentView {
      _contentView = contentView;
      _contentView.center = self.center;
      [self addSubview:_contentView];
}

- (void)setTitle:(NSString *)title {
      _title = title;
      [self initContentView];
}

- (void)setIcon:(UIImage *)icon {
      _icon = icon;
      [self initContentView];
}

- (void)setMessage:(NSString *)message {
      _message = message;
      [self initContentView];
}


- (void)initContentView {
      contentViewWidth = 250 * self.frame.size.width / 320;
      contentViewHeight = MARGIN_TOP;
     
      _contentView = [[UIView alloc] init];
      _contentView.backgroundColor = [UIColor whiteColor];
      _contentView.layer.cornerRadius = 5.0;
      _contentView.layer.masksToBounds = YES;
     
      [self initTitleAndIcon];
      [self initMessage];
      [self initAllButtons];
     
      _contentView.frame = CGRectMake(0, 0, contentViewWidth, contentViewHeight);
      _contentView.center = self.center;
      [self addSubview:_contentView];
}

- (void)initTitleAndIcon {
      _titleView = [[UIView alloc] init];
      if (_icon != nil) {
              _iconImageView = [[UIImageView alloc] init];
              _iconImageView.image = _icon;
              _iconImageView.frame = CGRectMake(0, 0, 20, 20);
              [_titleView addSubview:_iconImageView];
      }
     
      CGSize titleSize = [self getTitleSize];
      if (_title != nil && ![_title isEqualToString:@""]) {
              _titleLabel = [[UILabel alloc] init];
              _titleLabel.text = _title;
              _titleLabel.textColor = kColor(28, 28, 28, 1.0);
              _titleLabel.textAlignment = NSTextAlignmentCenter;
              _titleLabel.font = [UIFont systemFontOfSize:18.0f];
              _titleLabel.numberOfLines = 0;
              _titleLabel.lineBreakMode = NSLineBreakByWordWrappin g;
              _titleLabel.frame = CGRectMake(MaxX(_iconImageView) + SPACE_SMALL, 1, titleSize.width, titleSize.height);
              [_titleView addSubview:_titleLabel];
      }
     
      _titleView.frame = CGRectMake(0, MARGIN_TOP, _iconImageView.frame.size.width + SPACE_SMALL + titleSize.width, MAX(_iconImageView.frame.size.height, titleSize.height));
      _titleView.center = CGPointMake(contentViewWidth / 2, MARGIN_TOP + _titleView.frame.size.height / 2);
      [_contentView addSubview:_titleView];
     
      _headerLineView = [[UIView alloc]initWithFrame:CGRectMake(0, MaxY(_titleView)+ SPACE_SMALL, contentViewWidth, kLineHeight*2)];
      _headerLineView.backgroundColor = kGrayLineColor;
      [_contentView addSubview:_headerLineView];
     
      contentViewHeight += HEIGHT(_titleView)+HEIGHT(_headerLineView);
}



- (void)initMessage {
      if (_message != nil) {
              _messageLabel = [[UILabel alloc] init];
              _messageLabel.text = _message;
              _messageLabel.textColor = kColor(120, 120, 120, 1.0);
              _messageLabel.numberOfLines = 0;
              _messageLabel.font = [UIFont systemFontOfSize:BUTTON_FONT_SIZE];
             
              NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
              paragraphStyle.lineSpacing = MESSAGE_LINE_SPACE;
              NSDictionary *attributes = @{NSParagraphStyleAttribut eName:paragraphStyle};
              _messageLabel.attributedText = [[NSAttributedString alloc]initWithString:_message attributes:attributes];
              _messageLabel.textAlignment = NSTextAlignmentCenter;
             
              CGSize messageSize = [self getMessageSize];
              _messageLabel.frame = CGRectMake(MARGIN_LEFT_LARGE, MaxY(_headerLineView) + SPACE_LARGE, MAX(contentViewWidth - MARGIN_LEFT_LARGE - MARGIN_RIGHT_LARGE, messageSize.width), messageSize.height);
              [_contentView addSubview:_messageLabel];
              contentViewHeight += SPACE_LARGE + _messageLabel.frame.size.height;
      }
}


- (void)initAllButtons {
      if (_buttonTitleArray.count > 0) {
              contentViewHeight += SPACE_LARGE + 45;
              UIView *horizonSperatorView = [[UIView alloc] initWithFrame:CGRectMake(0, MaxY(_messageLabel) + SPACE_LARGE, contentViewWidth, kLineHeight)];
              horizonSperatorView.backgroundColor = kGrayLineColor;
              [_contentView addSubview:horizonSperatorView];
             
              CGFloat buttonWidth = contentViewWidth / _buttonTitleArray.count;
              for (NSString *buttonTitle in _buttonTitleArray) {
                      NSInteger index = [_buttonTitleArray indexOfObject:buttonTitle];
                      UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(index * buttonWidth, MaxY(horizonSperatorView), buttonWidth, 44)];
                      button.titleLabel.font = [UIFont systemFontOfSize:BUTTON_FONT_SIZE];
                      [button setTitle:buttonTitle forState:UIControlStateNormal];
                      [button setTitleColor:kColor(70, 130, 180, 1.0) forState:UIControlStateNormal];
                      [button addTarget:self action:@selector(buttonWithPressed:) forControlEvents:UIControlEventTouchUpIns ide];
                      [_buttonArray addObject:button];
                      [_contentView addSubview:button];
                     
                      if (index < _buttonTitleArray.count - 1) {
                              UIView *verticalSeperatorView = [[UIView alloc] initWithFrame:CGRectMake(MaxX(button), button.frame.origin.y, kLineHeight, button.frame.size.height)];
                              verticalSeperatorView.backgroundColor = kGrayLineColor;
                              [_contentView addSubview:verticalSeperatorView];
                      }
              }
      }
}

- (CGSize)getTitleSize {
      UIFont *font = [UIFont systemFontOfSize:18];
     
      NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
      paragraphStyle.lineBreakMode = NSLineBreakByWordWrappin g;
      NSDictionary *attributes = @{NSFontAttributeName:font, NSParagraphStyleAttribut eName:paragraphStyle.copy};
     
      CGSize size = [_title boundingRectWithSize:CGSizeMake(contentViewWidth - (MARGIN_LEFT_SMALL + MARGIN_RIGHT_SMALL + _iconImageView.frame.size.width + SPACE_SMALL), 2000)
                                                                            options:NSStringDrawingUsesLineF ragmentOrigin
                                                                      attributes:attributes context:nil].size;
     
      size.width = ceil(size.width);
      size.height = ceil(size.height);
     
      return size;
}

- (CGSize)getMessageSize {
      UIFont *font = [UIFont systemFontOfSize:BUTTON_FONT_SIZE];
     
      NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
      paragraphStyle.lineSpacing = MESSAGE_LINE_SPACE;
      NSDictionary *attributes = @{NSFontAttributeName:font, NSParagraphStyleAttribut eName:paragraphStyle.copy};
     
      CGSize size = [_message boundingRectWithSize:CGSizeMake(contentViewWidth - (MARGIN_LEFT_LARGE + MARGIN_RIGHT_LARGE), 2000)
                                                                                options:NSStringDrawingUsesLineF ragmentOrigin
                                                                          attributes:attributes context:nil].size;
     
      size.width = ceil(size.width);
      size.height = ceil(size.height);
     
      return size;
}

- (void)buttonWithPressed:(UIButton *)button {
      if (_delegate && [_delegate respondsToSelector:@selector(alertView:clickedButAtIndex:)]) {
              NSInteger index = [_buttonTitleArray indexOfObject:button.titleLabel.text];
              [_delegate alertView:self clickedButAtIndex:index];
      }
      if (self.afterClickIsHidden) {
              [self hide];
      }
}

- (void)show {
      //      UIWindow *window = [[UIApplication sharedApplication] keyWindow];
      //      NSArray *windowViews = [window subviews];
      //      if(windowViews && [windowViews count] > 0){
      //              UIView *subView = [windowViews objectAtIndex:[windowViews count]-1];
      //              for(UIView *aSubView in subView.subviews)
      //              {
      //                      [aSubView.layer removeAllAnimations];
      //              }
      //              [subView addSubview:self];
      //              [self showBackground];
      //              [self showAlertAnimation];
      //      }
      UIWindow *window = [[UIApplication sharedApplication].windows objectAtIndex:1];
      [window addSubview:self];
      [self showBackground];
      [self showAlertAnimation];
}

- (void)hide {
      _contentView.hidden = YES;
      [self hideAlertAnimation];
      [self removeFromSuperview];
}

- (void)setTitleColor:(UIColor *)color fontSize:(CGFloat)size {
      if (color != nil) {
              _titleLabel.textColor = color;
      }
     
      if (size > 0) {
              _titleLabel.font = [UIFont systemFontOfSize:size];
      }
}

- (void)setMessageColor:(UIColor *)color fontSize:(CGFloat)size {
      if (color != nil) {
              _messageLabel.textColor = color;
      }
     
      if (size > 0) {
              _messageLabel.font = [UIFont systemFontOfSize:size];
      }
}
- (void)setHeaderLineColor:(UIColor *)color{
      if (color != nil) {
              _headerLineView.backgroundColor = color;
      }
}

- (void)setButtonTitleColor:(UIColor *)color fontSize:(CGFloat)size atIndex:(NSInteger)index {
      UIButton *button = _buttonArray[index];
      if (color != nil) {
              [button setTitleColor:color forState:UIControlStateNormal];
      }
     
      if (size > 0) {
              button.titleLabel.font = [UIFont systemFontOfSize:size];
      }
}

- (void)showBackground
{
      _backgroundView.alpha = 0;
      [UIView beginAnimations:@"fadeIn" context:nil];
      [UIView setAnimationDuration:0.35];
      _backgroundView.alpha = 0.6;
      [UIView commitAnimations];
}

-(void)showAlertAnimation
{
      CAKeyframeAnimation * animation;
      animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
      animation.duration = 0.30;
      animation.removedOnCompletion = YES;
      animation.fillMode = kCAFillModeForwards;
      NSMutableArray *values = [NSMutableArray array];
      [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 1.0)]];
      [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
      [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
      animation.values = values;
      [_contentView.layer addAnimation:animation forKey:nil];
}

- (void)hideAlertAnimation {
      [UIView beginAnimations:@"fadeIn" context:nil];
      [UIView setAnimationDuration:0.35];
      _backgroundView.alpha = 0.0;
      [UIView commitAnimations];
}

- (void)tappedCancel
{
      [self hide];
}


@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值