自定义弹出框

//
//  WJViewController.m
//  WJAlertView
//
//  Created by 华通众和 on 16/5/5.
//  Copyright © 2016年 华鑫志和科技. All rights reserved.
//


#import "WJViewController.h"
#import "WJAlertViewController.h"
@interface WJViewController ()

@end

@implementation WJViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton * alertButton = [UIButton buttonWithType:UIButtonTypeCustom];
    alertButton.frame = CGRectMake(0, 300, self.view.frame.size.width, 50);
    [alertButton setBackgroundColor:[UIColor grayColor]];
    [alertButton addTarget:self action:@selector(alertAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:alertButton];
}


- (void)alertAction:(UIButton *)btn
{
    WJAlertViewController *WJVC = [[WJAlertViewController alloc] initWithTransitionStyle:TransitionDefault determineAction:^(NSString *determineText) {
        NSLog(@"determineText == %@",determineText);
    } andCancelAction:^{
        NSLog(@"点击了取消按钮");
    }];
    
    [self presentViewController:WJVC animated:YES completion:nil];
}






//
//  WJAlertViewController.h
//  WJAlertView
//
//  Created by 华通众和 on 16/5/5.
//  Copyright © 2017年 华鑫志和科技. All rights reserved.
//


#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, TransitionStyle) {
    TransitionVertical = 0,  //底部向上
    TransitionHorizontal ,   //翻转
    TransitionDefault,       //中间弹出
};
@interface WJAlertViewController : UIViewController
typedef void(^DetermineBlock)(NSString * determineText);        //返回输入文字
typedef void(^CancelBlock)();                                   //返回取消事件
@property (nonatomic, assign) TransitionStyle transitionStyle;  //弹出样式

- (instancetype)initWithTransitionStyle:(TransitionStyle)transitionStyle determineAction:(DetermineBlock)determineBlock andCancelAction:(CancelBlock)cancelBlcok;
@end



//
//  WJAlertViewController.m
//  WJAlertView
//
//  Created by 华通众和 on 16/5/5.
//  Copyright © 2017年 华鑫志和科技. All rights reserved.
//


#import "WJAlertViewController.h"
#define WJScreenWidth  [[UIScreen mainScreen] bounds].size.width
#define WJScreenHeight [[UIScreen mainScreen] bounds].size.height
#define OnePixel     (1./[UIScreen mainScreen].scale)
#define animateTime  0.35f
#define RGB(r,g,b,a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a]
#define WS(weakSelf) __unsafe_unretained __typeof(&*self)weakSelf = self;

@interface WJAlertViewController ()
@property (nonatomic, assign)   BOOL notifiKeyboardHide;
@property (nonatomic, strong)   UIView * operateView;           //操作视图
@property (nonatomic, strong)   UIButton * cancelBtn;           //取消按钮
@property (nonatomic, strong)   UIButton * confirmBtn;          //确定按钮
@property (nonatomic, strong)   UILabel * horLine;              //分割线
@property (nonatomic, strong)   UILabel * verLine;              //分割线
@property (nonatomic, strong)   UILabel *titleLabel;            //系统提示
@property (nonatomic, strong)   UIView * inputBkView;           //输入框背景
@property (nonatomic, strong)   UITextView *noteTV;             //输入框
@property (nonatomic, strong)   UILabel *placeHolderLabel;      //默认提示文字
@property (nonatomic, copy)     DetermineBlock determineBlock;  //确定按钮
@property (nonatomic, copy)     CancelBlock cancelBlock;        //返回按钮
@end

@implementation WJAlertViewController
- (instancetype)initWithTransitionStyle:(TransitionStyle)transitionStyle determineAction:(DetermineBlock)determineBlock andCancelAction:(CancelBlock)cancelBlcok
{
    
    if (self = [super init]) {
        self.determineBlock = determineBlock;
        self.cancelBlock = cancelBlcok;
        self.modalPresentationStyle = UIModalPresentationFormSheet;
        switch (transitionStyle) {
            case (0):
                self.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
                break;
            case (1):
                self.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
                break;
            default:
                self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
                break;
        }
        
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = RGB(127, 127, 127, 1);

}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self showAlertView];
}


#pragma mark - ----------------创建UI -------------------------
- (void)showAlertView
{
    _notifiKeyboardHide = NO;
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];
    
    
    [self shakeToShow:self.operateView];                //弹出框
    [self.operateView addSubview:self.horLine];         //分割线
    [self.operateView addSubview:self.verLine];         //分割线
    [self.operateView addSubview:self.titleLabel];      //系统提示
    [self.operateView addSubview:self.inputBkView];     //输入框背景
    [self.operateView addSubview:self.cancelBtn];       //返回按钮
    [self.operateView addSubview:self.confirmBtn];      //确定按钮
    [self.inputBkView addSubview:self.noteTV];          //输入框
    [self.noteTV addSubview:self.placeHolderLabel];     //默认文字
    [self.view addSubview:self.operateView];
    
}




#pragma mark -------------- 移除视图 -----------------
- (void)removeAlertView
{
    if ([_noteTV isFirstResponder]) {
        [_noteTV resignFirstResponder];
    }
    
    [UIView animateWithDuration:0.15 animations:^{
        _operateView.alpha = 0;
        _operateView.transform = CGAffineTransformMakeScale(0.1, 0.1);
    } completion:^(BOOL finished) {
        [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
        if (_notifiKeyboardHide) {
            [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
        }
        
        [self dismissViewControllerAnimated:YES completion:nil];
    }];
}



- (void)confirmAction:(UIButton *)sender
{
    WS(weakSelf);
    if (weakSelf.determineBlock) {
        weakSelf.determineBlock(_noteTV.text);
    }
    
    [weakSelf removeAlertView];
}
- (void)cancelAction:(UIButton *)sender
{
    WS(weakSelf);
    if (weakSelf.cancelBlock) {
        weakSelf.cancelBlock();
    }
    [weakSelf removeAlertView];
}

- (void)textChanged:(NSNotification *)notification
{
    if ([[self.noteTV text] length] == 0) {
        [[self.noteTV viewWithTag:999] setAlpha:1];
    }
    else {
        [[self.noteTV viewWithTag:999] setAlpha:0];
    }
}

#pragma mark -------------- 监听键盘弹起,操作框动画 -----------------
///键盘弹起,页面动画,监听
- (void)keyboardWillShow:(NSNotification *)notification
{
    //键盘的frame
    CGRect keyboardRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    //键盘高度
    CGFloat keyboardHeight = keyboardRect.size.height;
    //键盘升起后 键盘的Y坐标
    CGFloat keyboardOriginY = WJScreenHeight - keyboardHeight;
    //键盘升起后 提示框的Y坐标
    CGFloat operateMaxY = WJScreenHeight/2. + _operateView.bounds.size.height/2. + 16;
    
    if (operateMaxY >= keyboardOriginY) {
        [UIView animateWithDuration:0.25 animations:^{
            CGRect rect = _operateView.frame;
            rect.origin.y = keyboardOriginY - rect.size.height - 16;
            _operateView.frame = rect;
            
        } completion:^(BOOL finished) {
            
        }];
        _notifiKeyboardHide = YES;
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWillHide:)
                                                     name:UIKeyboardWillHideNotification
                                                   object:nil];
    }
    else {
        _notifiKeyboardHide = NO;
    }
}

#pragma mark -------------- 键盘收起,页面动画,监听 -----------------
- (void)keyboardWillHide:(NSNotification *)notification
{
    [UIView animateWithDuration:0.25 animations:^{
        CGRect rect = _operateView.frame;
        rect.origin.y = (WJScreenHeight - rect.size.height)/2.;
        _operateView.frame = rect;
    } completion:^(BOOL finished) {
        
    }];
}

#pragma mark -------------- 颜色转换为图片 -----------------
- (UIImage *)imageWithColor:(UIColor *)color andSize:(CGSize)aSize
{
    CGRect rect = CGRectMake(0.0f, 0.0f, aSize.width, aSize.height);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return image;
}


#pragma mark ---------------- 弹性震颤动画 -------------------
- (void)shakeToShow:(UIView *)aView
{
    CAKeyframeAnimation * popAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
    popAnimation.duration = 0.35;
    popAnimation.values = @[[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.01f, 0.01f, 1.0f)],
                            [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.05f, 1.05f, 1.0f)],
                            [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9f, 0.9f, 1.0f)],
                            [NSValue valueWithCATransform3D:CATransform3DIdentity]];
    popAnimation.keyTimes = @[@0.0f, @0.5f, @0.75f, @0.8f];
    popAnimation.timingFunctions = @[[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
                                     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut],
                                     [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
    [aView.layer addAnimation:popAnimation forKey:nil];
}
#pragma mark ---------------- 懒加载 -------------------
- (UIView *)operateView {
    if (_operateView == nil) {
        _operateView = [[UIView alloc] init];
        _operateView.center = CGPointMake(WJScreenWidth/2., WJScreenHeight/2.);
        _operateView.bounds = CGRectMake(0, 0, WJScreenWidth - 32, 208);
        _operateView.backgroundColor = [UIColor whiteColor];
        _operateView.layer.cornerRadius = 6;
        _operateView.clipsToBounds = YES;
    }
    return _operateView;
}

- (UIButton *)cancelBtn {
    if (_cancelBtn == nil) {
        _cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        _cancelBtn.frame = CGRectMake(0, CGRectGetHeight(_operateView.frame) - 48, _operateView.frame.size.width/2., 48);
        [_cancelBtn setTitleColor:RGB(51, 51, 51, 1) forState:UIControlStateNormal];
        [_cancelBtn setTitle:@"取消" forState:UIControlStateNormal];
        _cancelBtn.titleLabel.font = [UIFont boldSystemFontOfSize:16];
        [_cancelBtn setBackgroundImage:[self imageWithColor:RGB(255, 255, 255, 1) andSize:_cancelBtn.bounds.size] forState:UIControlStateNormal];
        [_cancelBtn addTarget:self action:@selector(confirmAction:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _cancelBtn;
}
- (UIButton *)confirmBtn {
    if (_confirmBtn == nil) {
        
        _confirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        _confirmBtn.frame = CGRectMake(_operateView.frame.size.width/2., CGRectGetHeight(_operateView.frame) - 48, _operateView.frame.size.width/2., 48) ;
        [_confirmBtn setTitleColor:RGB(51, 51, 51, 1) forState:UIControlStateNormal];
        [_confirmBtn setTitle:@"确认" forState:UIControlStateNormal];
        _confirmBtn.titleLabel.font = [UIFont boldSystemFontOfSize:16];
        [_confirmBtn setBackgroundImage:[self imageWithColor:RGB(255, 255, 255, 1) andSize:_cancelBtn.bounds.size] forState:UIControlStateNormal];
        [_confirmBtn addTarget:self action:@selector(confirmAction:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _confirmBtn;
}

- (UILabel *)horLine {
    if (_horLine == nil) {
        _horLine = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetHeight(_operateView.frame) - 48 - OnePixel, _operateView.frame.size.width, OnePixel)];
        _horLine.backgroundColor = RGB(230, 230, 230, 1);
    }
    return _horLine;
}

- (UILabel *)verLine {
    if (_verLine == nil) {
        _verLine = [[UILabel alloc] initWithFrame:CGRectMake(_operateView.frame.size.width/2. - OnePixel/2., CGRectGetHeight(_operateView.frame) - 48 - OnePixel, OnePixel, 48)];
        _verLine.backgroundColor = RGB(128 , 128, 128, 1);
    }
    return _verLine;
}

- (UILabel *)titleLabel {
    if (_titleLabel == nil) {
        _titleLabel = [[UILabel alloc] init];
        _titleLabel.bounds = CGRectMake(0, 0, CGRectGetWidth(_operateView.frame), 20);
        _titleLabel.center = CGPointMake(CGRectGetMidX(_operateView.bounds), 20);
        _titleLabel.text = @"拒绝原因";
        _titleLabel.textAlignment = NSTextAlignmentCenter;
    }
    return _titleLabel;
}

- (UIView *)inputBkView {
    if (_inputBkView == nil) {
        _inputBkView = [[UIView alloc] init];
        _inputBkView.layer.borderColor = RGB(230, 230, 230, 1).CGColor;
        _inputBkView.layer.borderWidth = 1;
        _inputBkView.bounds = CGRectMake(0, 0, CGRectGetWidth(_operateView.frame) - 64, 70);
        _inputBkView.center = CGPointMake(CGRectGetMidX(_operateView.bounds), 32 + 24 + 40);
    }
    return _inputBkView;
}
- (UITextView *)noteTV {
    if (_noteTV == nil) {
        _noteTV = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(_inputBkView.bounds), CGRectGetHeight(_inputBkView.bounds))];
        _noteTV.textColor = [UIColor blackColor];
        _noteTV.backgroundColor = [UIColor whiteColor];
        _noteTV.font = [UIFont systemFontOfSize:17.0];
        _noteTV.layer.borderColor = [UIColor colorWithRed:221 / 256.0 green:221 / 256.0 blue:221 / 256.0 alpha:1].CGColor;
        _noteTV.layer.borderWidth = 1;
        _noteTV.layer.cornerRadius = 3;
        _noteTV.layer.masksToBounds = YES;
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
    }
    return _noteTV;
}


- (UILabel *)placeHolderLabel{
    if (_placeHolderLabel == nil) {
        _placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 4, 200, 30)];
        _placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping;
        _placeHolderLabel.font = [UIFont systemFontOfSize:17.0];
        _placeHolderLabel.textColor = [UIColor colorWithRed:221 / 256.0 green:221 / 256.0 blue:221 / 256.0 alpha:1];
        _placeHolderLabel.backgroundColor = [UIColor clearColor];
        _placeHolderLabel.tag = 999;
        _placeHolderLabel.text = @"请输入内容";
        if ([self.noteTV.text length] == 0) {
            [[self.noteTV viewWithTag:999] setAlpha:1];
        }
    }
    return _placeHolderLabel;
}


- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
    
}



自定义弹出框