ifish/Ifish/views/CustomImgpicFiles/CustomView/PopView.m

542 lines
19 KiB
Objective-C
Executable File

//
// PopView.m
// PopView
//
// Created by 123 on 16/4/29.
// Copyright © 2016年 asura. All rights reserved.
//
#import "PopView.h"
#import "DrawView.h"
//屏幕宽和高
#define kScreenWidth ([UIScreen mainScreen].bounds.size.width)
#define kScreenHeight ([UIScreen mainScreen].bounds.size.height)
typedef NS_ENUM(NSInteger, PopViewType){
PopViewNormalType = 0,
PopViewPasswordType = 1 << 1,
PopViewCommentedType = 1 << 2,
PopViewSuccessType = 1 << 3,
PopViewFailureType = 1 << 4,
PopViewWaitingType = 1 << 5
};
#define kScreenFrame [UIScreen mainScreen].bounds
#define kScreenSpacing 10
@interface PopView () <UITextViewDelegate>
/** 操作界面 **/
@property (nonatomic, strong) UIWindow *window;
//底层背景视图
@property (nonatomic, strong) UIButton *bottomButton;
//记录创建该视图时当前 window 的等级
@property (nonatomic, assign) NSInteger windowLevel;
//提示标题
@property (nonatomic, copy) NSString *title;
//提示内容
@property (nonatomic, copy) NSString *content;
//按钮标题
@property (nonatomic, strong) NSArray *buttonTitle;
//存放 textField的数组
@property (nonatomic, strong) NSMutableArray *textFields;
//回调信息
@property (nonatomic, copy) NSString *messagString;
//弹出视图的样式
@property (nonatomic, assign) PopViewType popViewType;
//记录点击的标示
@property (nonatomic, assign) BOOL isHandle;
/** 状态提示界面 **/
//状态消息
@property (nonatomic, copy) NSString *showMessage;
//画图板
@property (nonatomic, strong) CAShapeLayer *shaperLayer;
//加载控件
@property (nonatomic, strong) DrawView *drawView;
@end
@implementation PopView
// Only override drawRect: if you perform custom drawing.
// An emprty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
#pragma mark - lazyloaded
- (NSMutableArray *)textFields{
if (!_textFields) {
self.textFields = [NSMutableArray array];
}
return _textFields;
}
#pragma mark - init
//普通视图
+ (void)initWithTitle:(NSString *)title content:(NSString *)content buttonTitle:(NSArray *)buttonTitle success:(void (^)())success failure:(void (^)())failure{
PopView *popView = [[PopView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth * 2 / 3, kScreenHeight / 6)];
popView.title = title;
popView.content = content;
popView.buttonTitle = buttonTitle;
popView.popViewType = PopViewNormalType;
[popView initConfgureBottomButtonAndWindow];
[popView initConfgureCenterView];
popView.success = success;
popView.failure = failure;
}
//密文视图
+ (void)initWithPassword:(NSString *)password buttonTitle:(NSArray *)buttonTitle message:(void (^)())message failure:(void (^)())failure{
PopView *popView = [[PopView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth * 2 / 3, kScreenHeight / 6)];
popView.title = password;
popView.buttonTitle = buttonTitle;
popView.popViewType = PopViewPasswordType;
[popView initConfgureBottomButtonAndWindow];
[popView initConfgureCenterView];
popView.message = message;
popView.failure = failure;
}
//评论视图
+ (void)initWithCommented:(NSString *)commented buttonTitle:(NSArray *)buttonTitle message:(void (^)(NSString *))message failure:(void (^)())failure{
PopView *popView = [[PopView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth * 2 / 3, kScreenHeight / 6)];
popView.title = commented;
popView.buttonTitle = buttonTitle;
popView.popViewType = PopViewCommentedType;
[popView initConfgureBottomButtonAndWindow];
[popView initConfgureCenterView];
popView.message = message;
popView.failure = failure;
}
//成功提示
+ (void)initWithSuccessString:(NSString *)successString{
PopView *popView = [[PopView alloc]initWithFrame:CGRectMake(0, 0, kScreenHeight / 8, kScreenHeight / 8)];
popView.showMessage = successString;
popView.popViewType = PopViewSuccessType;
[popView initConfgureBottomButtonAndWindow];
[popView initConfgureStatedCenterView];
}
//失败提示
+ (void)initWithFailureString:(NSString *)failureString{
PopView *popView = [[PopView alloc]initWithFrame:CGRectMake(0, 0, kScreenHeight / 8, kScreenHeight / 8)];
popView.showMessage = failureString;
popView.popViewType = PopViewFailureType;
[popView initConfgureBottomButtonAndWindow];
[popView initConfgureStatedCenterView];
}
//状态等待
+ (void)initWithWaitingString:(NSString *)waitingString{
PopView *popView = [[PopView alloc]initWithFrame:CGRectMake(0, 0, kScreenHeight / 8, kScreenHeight / 8)];
popView.showMessage = waitingString;
popView.popViewType = PopViewWaitingType;
[popView initConfgureBottomButtonAndWindow];
[popView initConfgureStatedCenterView];
}
//记载等待
+ (void)initWithWaiting{
PopView *popView = [[PopView alloc]initWithFrame:CGRectMake(0, 0, kScreenHeight / 8 - 10, kScreenHeight / 8 - 10)];
popView.popViewType = PopViewWaitingType;
[popView initConfgureBottomButtonAndWindow];
[popView initConfgureStatedCenterView];
}
//配置底层视图
- (void)initConfgureBottomButtonAndWindow{
self.window = [[[UIApplication sharedApplication]delegate]window];
self.windowLevel = self.window.windowLevel;
self.window.windowLevel = UIWindowLevelAlert + 1;
self.bottomButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.bottomButton.frame = kScreenFrame;
self.bottomButton.backgroundColor = [UIColor colorWithWhite:0.2 alpha:0.2];
self.window.backgroundColor = [UIColor colorWithWhite:0.2 alpha:0.4];
self.backgroundColor = [UIColor whiteColor];
[self.window addSubview:self.bottomButton];
[self.bottomButton addSubview:self];
}
//配置弹出视图及其子视图
- (void)initConfgureCenterView{
//self
self.center = self.bottomButton.center;
self.layer.cornerRadius = kScreenSpacing;
self.layer.masksToBounds = YES;
CGFloat selfWidth = CGRectGetWidth(self.frame);
CGFloat selfHeight = CGRectGetHeight(self.frame);
//title
UILabel *titleLabel = [self addSubViwLableWithFrame:CGRectMake(kScreenSpacing, 0, selfWidth - kScreenSpacing * 2, selfHeight / 3) title:self.title sizeFont:17 isTitle:YES];
if (self.popViewType == PopViewPasswordType) {
//密文
[self addTextFieldWithSelfWidth:selfWidth titleLabel:titleLabel];
}else if (self.popViewType == PopViewNormalType){
//普通
[self addSubViwLableWithFrame:CGRectMake(kScreenSpacing, CGRectGetMaxY(titleLabel.frame), selfWidth - kScreenSpacing * 2, selfHeight / 3) title:self.content sizeFont:14 isTitle:NO];
}else if (self.popViewType == PopViewCommentedType){
//评论
[self addTextViewWithSelfWidth:selfWidth selfHeight:selfHeight titleLabel:titleLabel];
}
//button
[self addButtonWithSelfWidth:selfWidth selfHeight:selfHeight];
//分割线
[self addLineWithSelfWidth:selfWidth selfHeight:selfHeight];
//显示动画
[self showAnimationPopView];
}
- (id)addSubViwLableWithFrame:(CGRect)frame title:(NSString *)title sizeFont:(int)sizeFont isTitle:(BOOL)isTitle{
UILabel *titleLabel = [[UILabel alloc]initWithFrame:frame];
[self addSubview:titleLabel];
titleLabel.text = title;
titleLabel.textAlignment = NSTextAlignmentCenter;
if (isTitle) {
titleLabel.font = [UIFont boldSystemFontOfSize:sizeFont];
}else{
titleLabel.font = [UIFont systemFontOfSize:sizeFont];
}
return titleLabel;
}
//textField
- (void)addTextFieldWithSelfWidth:(CGFloat)selfWidth titleLabel:(UILabel *)titleLabel{
CGFloat textFieldWidth = (selfWidth - kScreenSpacing * 7) / 6;
for (int i = 0; i < 6; i ++) {
UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake((textFieldWidth + kScreenSpacing) * i + kScreenSpacing, CGRectGetMaxY(titleLabel.frame), textFieldWidth, textFieldWidth)];
[self addSubview:textField];
textField.layer.borderColor = [UIColor lightGrayColor].CGColor;
textField.layer.borderWidth = 1;
[textField addTarget:self action:@selector(editigChanged:) forControlEvents:UIControlEventEditingChanged];
textField.tag = 200 + i;
textField.keyboardType = UIKeyboardTypeNumberPad;
[self.textFields addObject:textField];
textField.secureTextEntry = YES;
textField.textAlignment = NSTextAlignmentCenter;
if (i != 0) {
textField.enabled = NO;
}
if (i == 0) {
[textField becomeFirstResponder];
}
}
}
//button
- (void)addButtonWithSelfWidth:(CGFloat)selfWidth selfHeight:(CGFloat)selfHeight{
CGFloat buttonWidth = (selfWidth - kScreenSpacing * (self.buttonTitle.count + 1)) / self.buttonTitle.count;
for (int i = 0; i < self.buttonTitle.count; i ++) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake((buttonWidth + kScreenSpacing ) * i + kScreenSpacing,selfHeight * 2 / 3, buttonWidth, selfHeight / 3);
[button setTitle:self.buttonTitle[i] forState:UIControlStateNormal];
[self addSubview:button];
button.tag = 100 + i;
[button addTarget:self action:@selector(handleAction:) forControlEvents:UIControlEventTouchUpInside];
[button setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal];
button.titleLabel.font = [UIFont systemFontOfSize:15];
}
}
//分割线
- (void)addLineWithSelfWidth:(CGFloat)selfWidth selfHeight:(CGFloat)selfHeight{
UIView *hView = [[UIView alloc]initWithFrame:CGRectMake(0, selfHeight * 2 / 3 - 1, selfWidth, 1)];
hView.backgroundColor = [UIColor lightGrayColor];
[self addSubview:hView];
if (self.buttonTitle.count == 2) {
UIView *Vview = [[UIView alloc]initWithFrame:CGRectMake(selfWidth / 2 - 0.5, selfHeight * 2 / 3, 1, selfHeight / 3)];
Vview.backgroundColor = [UIColor lightGrayColor];
[self addSubview:Vview];
}
}
- (void)addTextViewWithSelfWidth:(CGFloat)selfWidth selfHeight:(CGFloat)selfHeight titleLabel:(UILabel *)titleLabel{
UITextView *textView = [[UITextView alloc]initWithFrame:CGRectMake(kScreenSpacing, CGRectGetMaxY(titleLabel.frame), selfWidth - kScreenSpacing * 2, selfHeight / 3 - 2)];
textView.layer.cornerRadius = kScreenSpacing / 2;
textView.layer.masksToBounds = YES;
textView.layer.borderColor = [UIColor lightGrayColor].CGColor;
textView.layer.borderWidth = 1;
[self addSubview:textView];
textView.delegate = self;
}
//状态模式的配置子视图
- (void)initConfgureStatedCenterView{
//self
self.center = self.bottomButton.center;
self.layer.cornerRadius = kScreenSpacing;
self.layer.masksToBounds = YES;
CGFloat selfWidth = CGRectGetWidth(self.frame);
CGFloat selfHeight = CGRectGetHeight(self.frame);
if (self.popViewType == PopViewWaitingType) {
//laoding
[self loadingWithSelfWidth:selfWidth selfHeight:selfHeight];
}else{
//画图
[self drawRectWithSelfWidth:selfWidth selfHeight:selfHeight];
}
// label
[self addSubViwLableWithFrame:CGRectMake(kScreenSpacing, selfHeight * 2 / 3 - 5, selfWidth - kScreenSpacing * 2, selfHeight / 3) title:self.showMessage sizeFont:14 isTitle:NO];
[self showAnimationPopView];
[self drawRectAnimation];
//存在,则直接返回
if (self.drawView) return;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.9 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self disssmissAnimationPopView];
});
}
//移除
+ (void)dissmissPopview{
NSArray *windows = [UIApplication sharedApplication].windows;
for (UIView *window in windows) {
if ([window isKindOfClass:[UIWindow class]]) {
for (UIView *view in window.subviews) {
if ([view isKindOfClass:[UIButton class]]) {
for (UIView *subView in view.subviews) {
if ([subView isKindOfClass:[PopView class]]) {
[((PopView *)subView) disssmissAnimationPopView];
[((PopView *)subView).drawView stopAnimating];
}
}
}
}
}
}
}
- (void)drawRectWithSelfWidth:(CGFloat)selfWidth selfHeight:(CGFloat)selfHeight{
//画图
CGPoint centerPoint = CGPointMake(selfWidth / 2, selfHeight / 3);
UIBezierPath *bezierPath = [UIBezierPath bezierPathWithArcCenter:centerPoint radius:selfHeight / 4 startAngle:0 endAngle:2 * M_PI clockwise:YES];
bezierPath.lineCapStyle = kCGLineCapRound;
bezierPath.lineJoinStyle = kCGLineJoinRound;
if (self.popViewType == PopViewSuccessType) {
//成功状态
[bezierPath moveToPoint: CGPointMake(selfWidth / 2 - selfHeight / 4 + 5, selfHeight / 3 + 5)];
[bezierPath addLineToPoint: CGPointMake(selfWidth / 2 - 5, selfHeight / 3 + selfHeight / 4 - 5)];
[bezierPath addLineToPoint: CGPointMake(selfWidth / 2 + selfHeight / 8, selfHeight / 4)];
[bezierPath addLineToPoint:CGPointMake(selfWidth / 2 + selfHeight / 6, selfHeight / 4)];
}else if (self.popViewType == PopViewFailureType){
//失败状态
[bezierPath moveToPoint:CGPointMake(selfWidth / 2 - selfHeight / 4 + kScreenSpacing, selfHeight / 5)];
[bezierPath addLineToPoint:CGPointMake(selfWidth / 2 + selfHeight / 8, selfHeight / 2)];
[bezierPath moveToPoint:CGPointMake(selfWidth / 2 + selfHeight / 4 - kScreenSpacing, selfHeight / 5)];
[bezierPath addLineToPoint:CGPointMake(selfWidth / 2 - selfHeight / 4 + kScreenSpacing, selfHeight / 2)];
}
self.shaperLayer = [CAShapeLayer layer];
self.shaperLayer.frame = self.bounds;
self.shaperLayer.lineWidth = 2;
self.shaperLayer.strokeColor = [UIColor blueColor].CGColor;
self.shaperLayer.fillColor = [UIColor clearColor].CGColor;
self.shaperLayer.path = bezierPath.CGPath;
[self.layer addSublayer:self.shaperLayer];
}
- (void)loadingWithSelfWidth:(CGFloat)selfWidth selfHeight:(CGFloat)selfHeight{
//加载控件
self.drawView = [[DrawView alloc]initWithFrame:CGRectMake(kScreenSpacing, kScreenSpacing, selfWidth - kScreenSpacing * 2, selfHeight * 2 / 3 - kScreenSpacing * 2)];
[self addSubview:self.drawView];
[self.drawView startAnimating];
}
#pragma mark - animation
//show动画
- (void)showAnimationPopView{
self.transform = CGAffineTransformMakeScale(0, 0);
[UIView animateWithDuration:0.6 delay:0 usingSpringWithDamping:0.55 initialSpringVelocity:0 options:UIViewAnimationOptionTransitionNone animations:^{
self.transform = CGAffineTransformMakeScale(1, 1);
} completion:^(BOOL finished) {
}];
}
// dissmiss 动画
- (void)disssmissAnimationPopView{
//设置还原 window 的 leavel
self.window.windowLevel = self.windowLevel;
[UIView animateKeyframesWithDuration:0.4 delay:0 options:UIViewKeyframeAnimationOptionRepeat animations:^{
CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
basicAnimation.fromValue = @1.0f;
basicAnimation.toValue = @0.f;
basicAnimation.duration = 0.4;
basicAnimation.removedOnCompletion = NO;
basicAnimation.fillMode = kCAFillModeForwards;
[self.layer addAnimation:basicAnimation forKey:@"scale"];
} completion:^(BOOL finished) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.bottomButton removeFromSuperview];
});
}];
}
//画图动画
- (void)drawRectAnimation{
CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
basicAnimation.fromValue = @0;
basicAnimation.toValue = @1;
basicAnimation.duration = 0.6;
[self.shaperLayer addAnimation:basicAnimation forKey:@"strokeEnd"];
}
#pragma mark - action
//点击事件
- (void)handleAction:(UIButton *)sender{
//先取消输入框的第一响应者
if (self.popViewType == PopViewCommentedType) {
for (UIView *view in self.subviews) {
if ([view isKindOfClass:[UITextView class]]) {
[((UITextView *)view) resignFirstResponder];
}
}
}
if (sender.tag == 100) {
self.success ? self.success() : nil;
self.message ? self.message(self.messagString) : nil;
}else{
self.failure ? self.failure() : nil;
}
if (!self.isHandle) {
[self disssmissAnimationPopView];
self.isHandle = YES;
}
}
//textFiled 的事件
- (void)editigChanged:(UITextField *)textField{
switch (textField.tag) {
case 200:
{
[self confgureTextFieldWithChangedTextFiled:textField indexTage:0];
self.messagString = textField.text;
}
break;
case 201:
{
[self confgureTextFieldWithChangedTextFiled:textField indexTage:1];
self.messagString = [NSString stringWithFormat:@"%@%@",self.messagString,textField.text];
}
break;
case 202:
{
[self confgureTextFieldWithChangedTextFiled:textField indexTage:2];
self.messagString = [NSString stringWithFormat:@"%@%@",self.messagString,textField.text];
}
break;
case 203:
{
[self confgureTextFieldWithChangedTextFiled:textField indexTage:3];
self.messagString = [NSString stringWithFormat:@"%@%@",self.messagString,textField.text];
}
break;
case 204:
{
[self confgureTextFieldWithChangedTextFiled:textField indexTage:4];
self.messagString = [NSString stringWithFormat:@"%@%@",self.messagString,textField.text];
}
break;
case 205:
{
[self confgureTextFieldWithChangedTextFiled:textField indexTage:5];
self.messagString = [NSString stringWithFormat:@"%@%@",self.messagString,textField.text];
}
break;
default:
break;
}
}
- (void)confgureTextFieldWithChangedTextFiled:(UITextField *)changedTextFiled indexTage:(int)indexTage{
if (changedTextFiled == self.textFields[indexTage]) {
//限制输入的字符长度
if (changedTextFiled.text.length == 1) {
//输入完之后关闭交互
changedTextFiled.enabled = NO;
//选择交互和直接返回的判断
if (indexTage + 1 == self.textFields.count){
UIButton *sureButton = [self viewWithTag:100];
sureButton.enabled = YES;
}else{
((UITextField *)self.textFields[indexTage + 1]).enabled = YES;
[((UITextField *)self.textFields[indexTage + 1]) becomeFirstResponder];
}
}
}
}
#pragma mark - layoutSubviews
- (void)layoutSubviews{
[super layoutSubviews];
self.alpha = 0.7;
[self.window insertSubview:self.bottomButton atIndex:INT32_MAX];
//如果是密码输入.则关掉确定按钮的交互
if (self.textFields.count != 0) {
UIButton *sureButton = [self viewWithTag:100];
sureButton.enabled = NO;
}
}
#pragma mark - UITextView delegate
- (void)textViewDidEndEditing:(UITextView *)textView{
self.messagString = textView.text;
}
@end