// // 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]; }