首页 > 技术文章 > ios-弹窗输入六位密码

sayimba 2017-01-24 10:45 原文

 

 

 

//
//  ViewController.m
//  设置密码

#import "ViewController.h"
#import "PasswordView.h"

#define Color_RGB(a,b,c,d) [UIColor colorWithRed:(a)/255.0 green:(b)/255.0 blue:(c)/255.0 alpha:(d)]
#define GrayColor  Color_RGB(236,236,236,1)//headerView 灰
#define screenWidth [UIScreen mainScreen].bounds.size.width
#define screenHeight [UIScreen mainScreen].bounds.size.height
#define RGBACOLOR(a,b,c,d) Color_RGB(a,b,c,d)
#define Font(a)     [UIFont systemFontOfSize:a];
#define littleBlackColor  Color_RGB(79,79,79,1)// 字体浅黑
#define YellowColor  Color_RGB(253,131,42,1)//主题黄
#define LineGrayColor  Color_RGB(210,210,210,1)//分割线 灰


@interface ViewController ()<UITableViewDelegate,UITableViewDataSource,PasswordViewDelegate>
@property (nonatomic,strong) UITableView *tableView;
@property (nonatomic,strong) NSMutableArray *dataArray;
@property (nonatomic,strong) UIView *alphaView;
@property (nonatomic,strong) NSString *checkString;
@property (nonatomic,strong) NSString *updateString;
@property (nonatomic) NSInteger integer;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = GrayColor;
    self.alphaView = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
    self.dataArray = [NSMutableArray arrayWithObjects:@"修改提现密码",@"忘记提现密码", nil];
    [self initSubview];
}

-(void)initSubview{

    self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 64, screenWidth, screenHeight) style:UITableViewStyleGrouped];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return 2;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *string = @"tradeCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:string];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:string];
    }
    
    cell.textLabel.text = self.dataArray[indexPath.row];
    cell.textLabel.font = Font(14);
    cell.textLabel.textColor = littleBlackColor;
    cell.accessoryView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"personal_arrow"]];
    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    self.integer = 1;
    [self initAlphaViewAndString:@"请输入原提现密码"];
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 43;
}

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 0.001;
}
-(void)initAlphaViewAndString:(NSString *)string
{
    
    self.alphaView.backgroundColor = RGBACOLOR(0, 0, 0, 0.3);
    self.alphaView.alpha = 1;
    //    UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
    //    [window addSubview:self.alphaView];
    
    [self.view addSubview:self.alphaView];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapToDismiss)];
    [self.alphaView addGestureRecognizer:tap];
    
    UIView *whiteV = [[UIView alloc]initWithFrame:CGRectMake(20, 110, screenWidth - 40, 140)];
    whiteV.backgroundColor = [UIColor whiteColor];
    
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(20, 25, screenWidth - 80, 15)];
    label.textColor = YellowColor;
    label.text = string;
    label.font = Font(12);
    [whiteV addSubview:label];
    
    PasswordView *password = [[PasswordView alloc]initWithFrame:CGRectMake(20, CGRectGetMaxY(label.frame) + 20, screenWidth - 80, 43)];
    [whiteV addSubview:password];
    password.layer.borderColor = LineGrayColor.CGColor;
    password.layer.borderWidth = 0.5;
    password.delegate = self;
    password.backgroundColor = [UIColor whiteColor];
    
    [self.alphaView addSubview:whiteV];
    
    
    CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
    animation.duration = 0.5;
    
    NSMutableArray *values = [NSMutableArray array];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.8, 0.8, 1.0)]];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 1.0)]];
    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
    animation.values = values;
    [whiteV.layer addAnimation:animation forKey:nil];
}

-(void)tapToDismiss{
    
    [UIView animateWithDuration:0.2 animations:^{
        [self.alphaView endEditing:YES];
        
        self.alphaView.alpha = 0;
    } completion:^(BOOL finished) {
        [self.alphaView removeFromSuperview];
    }];
}

#pragma mark PasswordView Delegate
-(void)passWordDidChange:(PasswordView *)password
{
    NSLog(@"改变%@",password.textStore);
}

-(void)passWordBeginInput:(PasswordView *)password
{
    NSLog(@"开始输入%@",password.textStore);
}

-(void)passWordCompleteInput:(PasswordView *)password
{
    NSLog(@"输入完成%@",password.textStore);
    
    if (password.textStore.length == 6 && self.integer == 1) {
        
        self.checkString = password.textStore;
        //延迟执行
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self checkPassword];
        });
    }
    if (password.textStore.length == 6 && self.integer == 2) {
        
        self.updateString = password.textStore;
        //延迟执行
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self updatePassword];
        });
    }  
}

//验证原始密码
-(void)checkPassword
{
    [self tapToDismiss];
    NSLog(@"验证原始密码");
}

//更改密码
-(void)updatePassword
{
    [self tapToDismiss];
    NSLog(@"更改密码");
}
@end
//
//  PasswordView.h
#import <UIKit/UIKit.h>
@class PasswordView;

@protocol PasswordViewDelegate<NSObject>

-(void)passWordDidChange:(PasswordView *)password;

-(void)passWordCompleteInput:(PasswordView *)password;

-(void)passWordBeginInput:(PasswordView *)password;

@end

@interface PasswordView : UIView<UIKeyInput>

@property (nonatomic) NSInteger passWordNum;//密码的位数
@property (nonatomic) CGFloat squareWidth;//密码框的大小
@property (nonatomic) CGFloat pointRadius;//黑点半径
@property (nonatomic) UIColor *pointColor;//黑点颜色
@property (nonatomic) UIColor *rectColor;//边框颜色
@property (nonatomic) id<PasswordViewDelegate> delegate;//
@property (nonatomic,readonly,strong) NSMutableString *textStore;//保存密码的字符串

@end
//
//  PasswordView.m

#import "PasswordView.h"

#define Color_RGB(a,b,c,d) [UIColor colorWithRed:(a)/255.0 green:(b)/255.0 blue:(c)/255.0 alpha:(d)]
#define LineGrayColor  Color_RGB(210,210,210,1)//分割线 灰
#define BlackColor [UIColor blackColor]

@interface PasswordView ()

@property (nonatomic,strong) NSMutableString *textStore;

@end

@implementation PasswordView

static NSString  * const MONEYNUMBERS = @"0123456789";



-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        
        self.textStore = [NSMutableString string];
        self.squareWidth = frame.size.width/6.0;
        self.passWordNum = 6;
        self.pointRadius = 6;
        self.rectColor = LineGrayColor;
        self.pointColor = BlackColor;
        [self becomeFirstResponder];
    }
    
    return  self;
}


/**
 * 设置密码框边长
 */
-(void)setSquareWidth:(CGFloat)squareWidth
{
    _squareWidth = squareWidth;
    [self setNeedsDisplay];
}

/**
 * 设置键盘类型
 */

-(UIKeyboardType)keyboardType
{
    return UIKeyboardTypeNumberPad;
}

/**
 *  设置密码位数
 *
 */

-(void)setPassWordNum:(NSInteger)passWordNum
{
    _passWordNum = passWordNum;
    [self setNeedsDisplay];
}

-(BOOL)becomeFirstResponder
{
    if ([self.delegate respondsToSelector:@selector(passWordBeginInput:)]) {
        [self.delegate passWordBeginInput:self];
    }
    
    return [super becomeFirstResponder];
}

/**
 *  是否成为第一响应者
 *
 */
-(BOOL)canBecomeFirstResponder
{
    return YES;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if (![self isFirstResponder]) {
        [self becomeFirstResponder];
    }
}

#pragma mark - UIKeyInput
/**
 * 用于显示的文本对象是否有任何文本
 */
-(BOOL)hasText
{
    return self.textStore.length > 0;
}

/**
 *插入文本
 */
-(void)insertText:(NSString *)text
{
    if (self.textStore.length < self.passWordNum) {
        
        //判断是否有数字
        NSCharacterSet *character = [[NSCharacterSet characterSetWithCharactersInString:MONEYNUMBERS] invertedSet];
        
        NSString *filter = [[text componentsSeparatedByCharactersInSet:character] componentsJoinedByString:@""];

        BOOL basicTest = [text isEqualToString:filter];
        if (basicTest) {
            [self.textStore appendString:text];
            if ([self.delegate respondsToSelector:@selector(passWordDidChange:)]) {
                [self.delegate passWordDidChange:self];
            }
            
            if (self.textStore.length == self.passWordNum) {
                if ([self.delegate respondsToSelector:@selector(passWordCompleteInput:)]) {
                    [self.delegate passWordCompleteInput:self];
                }
            }
            [self setNeedsDisplay];
            
        }
        
    }
}

//删除文本
-(void)deleteBackward
{
    if (self.textStore.length > 0) {
        [self.textStore deleteCharactersInRange:NSMakeRange(self.textStore.length - 1, 1)];
        if ([self.delegate respondsToSelector:@selector(passWordDidChange:)]) {
            [self.delegate passWordDidChange:self];
        }
    }
    
    [self setNeedsDisplay];
}

-(void)drawRect:(CGRect)rect
{
    CGFloat height = rect.size.height;
    CGFloat width = rect.size.width;
    
    CGFloat x = (width - self.squareWidth * self.passWordNum)/2.0;
    CGFloat y = (height - self.squareWidth)/2.0;
    
    CGContextRef context = UIGraphicsGetCurrentContext();
//    //画外框
////    
//    CGContextAddRect(context, CGRectMake(x, y, self.squareWidth * self.passWordNum, self.squareWidth));
    CGContextSetLineWidth(context, 0.5);
    CGContextSetStrokeColorWithColor(context, self.rectColor.CGColor);
//    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
//
    //画竖条
    for (int i = 1; i < self.passWordNum; i ++) {
        CGContextMoveToPoint(context, x + self.squareWidth * i, y);
        CGContextAddLineToPoint(context, x + self.squareWidth * i, y + self.squareWidth);
        CGContextClosePath(context);
    }
    
    CGContextDrawPath(context, kCGPathStroke);
    CGContextSetFillColorWithColor(context, self.pointColor.CGColor);
    
    //画黑点
    for (int i = 1; i <= self.textStore.length; i++) {
        CGContextAddArc(context, x + self.squareWidth * i - self.squareWidth/2.0, y + self.squareWidth/2.0, self.pointRadius, 0, M_PI * 2, YES);
        CGContextDrawPath(context, kCGPathFill);
    }
}



@end

 

推荐阅读