码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发——高级技术&密码锁功能的实现

时间:2015-06-24 22:24:46      阅读:475      评论:0      收藏:0      [点我收藏+]

标签:

密码锁功能的实现

一个ios手势密码功能实现

ipad/iphone 都可以用

没有使用图片,里面可以通过view自己添加

keychain做的数据持久化,利用苹果官方KeychainItemWrapper类

keychain存储的数据不会因为删除app而清除记录,请调用-(void)clear清除储存密码。

简单使用方式

下载后直接把 GesturePassword 下的GesturePassword文件丢到项目中去

在 TARGETS - Build Phases - "KeychainItemWrapper.m" - Compiler Flags (-fno-objc-arc)

在需要的地方直接可以调用ViewController

第一次的时候会两次验证密码

以后便会以这个密码进行确认

清空密码可以调用 - (void)clear

- (void)verify 验证手势密码在这里

- (void)reset 重置手势密码在这 (第一次回调用到这里进行第一次设置

技术分享

 

保存于读取密码:

直接贴代码

KeychainItemWrapper *keychain=[[KeychainItemWrapper alloc] initWithIdentifier:@"xxxxxx" accessGroup:nil];//xxxx 自定义


保存

[keyWrapper setObject:@"myChainValues" forKey:(id)kSecAttrService];

[keyWrapper setObject:[usernameTextField text] forKey:(id)kSecAttrAccount];// 上面两行用来标识一个Item

[keyWrapper setObject:[passwordTextField text] forKey:(id)kSecValueData];


读取

[usernameTextField setText:[keyWrapper  objectForKey:(id)kSecAttrAccount]];

[passwordTextField setText:[keyWrapper objectForKey:(id)kSecValueData]];



另外需要引入Security.framework 和KeychainItemWrapper头文件(百度一下多得是)

 

下面简单的实现一下

一:我们先导入这个框架

技术分享

二:新建一个手势密码的View分别在.h和.m文件中实现以下代码

GesturePasswordView.h

 1 @protocol GesturePasswordDelegate <NSObject>
 2 
 3 - (void)forget;
 4 - (void)change;
 5 
 6 @end
 7 
 8 #import <UIKit/UIKit.h>
 9 #import "TentacleView.h"
10 
11 @interface GesturePasswordView : UIView<TouchBeginDelegate>
12 
13 @property (nonatomic,strong) TentacleView * tentacleView;
14 
15 @property (nonatomic,strong) UILabel * state;
16 
17 @property (nonatomic,assign) id<GesturePasswordDelegate> gesturePasswordDelegate;
18 
19 @property (nonatomic,strong) UIImageView * imgView;
20 @property (nonatomic,strong) UIButton * forgetButton;
21 @property (nonatomic,strong) UIButton * changeButton;
22 
23 @end

GesturePasswordView.m

  1 #import "GesturePasswordView.h"
  2 #import "GesturePasswordButton.h"
  3 #import "TentacleView.h"
  4 
  5 @implementation GesturePasswordView {
  6     NSMutableArray * buttonArray;
  7     
  8     CGPoint lineStartPoint;
  9     CGPoint lineEndPoint;
 10     
 11 }
 12 @synthesize imgView;
 13 @synthesize forgetButton;
 14 @synthesize changeButton;
 15 
 16 @synthesize tentacleView;
 17 @synthesize state;
 18 @synthesize gesturePasswordDelegate;
 19 
 20 - (id)initWithFrame:(CGRect)frame
 21 {
 22     self = [super initWithFrame:frame];
 23     if (self) {
 24         // Initialization code
 25         buttonArray = [[NSMutableArray alloc]initWithCapacity:0];
 26         
 27         UIView * view = [[UIView alloc]initWithFrame:CGRectMake(frame.size.width/2-160, frame.size.height/2-80, 320, 320)];
 28         for (int i=0; i<9; i++) {
 29             NSInteger row = i/3;
 30             NSInteger col = i%3;
 31             // Button Frame
 32             
 33             NSInteger distance = 320/3;
 34             NSInteger size = distance/1.5;
 35             NSInteger margin = size/4;
 36             GesturePasswordButton * gesturePasswordButton = [[GesturePasswordButton alloc]initWithFrame:CGRectMake(col*distance+margin, row*distance, size, size)];
 37             [gesturePasswordButton setTag:i];
 38             [view addSubview:gesturePasswordButton];
 39             [buttonArray addObject:gesturePasswordButton];
 40         }
 41         frame.origin.y=0;
 42         [self addSubview:view];
 43         tentacleView = [[TentacleView alloc]initWithFrame:view.frame];
 44         [tentacleView setButtonArray:buttonArray];
 45         [tentacleView setTouchBeginDelegate:self];
 46         [self addSubview:tentacleView];
 47         
 48         state = [[UILabel alloc]initWithFrame:CGRectMake(frame.size.width/2-140, frame.size.height/2-120, 280, 30)];
 49         [state setTextAlignment:NSTextAlignmentCenter];
 50         [state setFont:[UIFont systemFontOfSize:14.f]];
 51         [self addSubview:state];
 52         
 53         
 54         imgView = [[UIImageView alloc]initWithFrame:CGRectMake(frame.size.width/2-35, frame.size.width/2-80, 70, 70)];
 55         [imgView setBackgroundColor:[UIColor whiteColor]];
 56         [imgView.layer setCornerRadius:35];
 57         [imgView.layer setBorderColor:[UIColor grayColor].CGColor];
 58         [imgView.layer setBorderWidth:3];
 59         [self addSubview:imgView];
 60         
 61         forgetButton = [[UIButton alloc]initWithFrame:CGRectMake(frame.size.width/2-150, frame.size.height/2+220, 120, 30)];
 62         [forgetButton.titleLabel setFont:[UIFont systemFontOfSize:14]];
 63         [forgetButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
 64         [forgetButton setTitle:@"忘记手势密码" forState:UIControlStateNormal];
 65         [forgetButton addTarget:self action:@selector(forget) forControlEvents:UIControlEventTouchDown];
 66         [self addSubview:forgetButton];
 67         
 68         changeButton = [[UIButton alloc]initWithFrame:CGRectMake(frame.size.width/2+30, frame.size.height/2+220, 120, 30)];
 69         [changeButton.titleLabel setFont:[UIFont systemFontOfSize:14]];
 70         [changeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
 71         [changeButton setTitle:@"修改手势密码" forState:UIControlStateNormal];
 72         [changeButton addTarget:self action:@selector(change) forControlEvents:UIControlEventTouchDown];
 73         [self addSubview:changeButton];
 74     }
 75     
 76     return self;
 77 }
 78 
 79 // Only override drawRect: if you perform custom drawing.
 80 // An empty implementation adversely affects performance during animation.
 81 
 82 - (void)drawRect:(CGRect)rect
 83 {
 84     // Drawing code
 85     CGContextRef context = UIGraphicsGetCurrentContext();
 86     
 87     CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
 88     CGFloat colors[] =
 89     {
 90         134 / 255.0, 157 / 255.0, 147 / 255.0, 1.00,
 91         3 / 255.0,  3 / 255.0, 37 / 255.0, 1.00,
 92     };
 93     CGGradientRef gradient = CGGradientCreateWithColorComponents
 94     (rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));
 95     CGColorSpaceRelease(rgb);
 96     CGContextDrawLinearGradient(context, gradient,CGPointMake
 97                                 (0.0,0.0) ,CGPointMake(0.0,self.frame.size.height),
 98                                 kCGGradientDrawsBeforeStartLocation);
 99 }
100 
101 - (void)gestureTouchBegin {
102     [self.state setText:@""];
103 }
104 
105 -(void)forget{
106     [gesturePasswordDelegate forget];
107 }
108 
109 -(void)change{
110     [gesturePasswordDelegate change];
111 }
112 
113 
114 @end

三:再自定义一个View用于实现界面的布局与处理

TentacleView.h
 1 #import <UIKit/UIKit.h>
 2 
 3 @protocol ResetDelegate <NSObject>
 4 
 5 - (BOOL)resetPassword:(NSString *)result;
 6 
 7 @end
 8 
 9 @protocol VerificationDelegate <NSObject>
10 
11 - (BOOL)verification:(NSString *)result;
12 
13 @end
14 
15 @protocol TouchBeginDelegate <NSObject>
16 
17 - (void)gestureTouchBegin;
18 
19 @end
20 
21 
22 
23 @interface TentacleView : UIView
24 
25 @property (nonatomic,strong) NSArray * buttonArray;
26 
27 @property (nonatomic,assign) id<VerificationDelegate> rerificationDelegate;
28 
29 @property (nonatomic,assign) id<ResetDelegate> resetDelegate;
30 
31 @property (nonatomic,assign) id<TouchBeginDelegate> touchBeginDelegate;
32 
33 /*
34  1: Verify
35  2: Reset
36  */
37 @property (nonatomic,assign) NSInteger style;
38 
39 - (void)enterArgin;
40 
41 @end
TentacleView.m
  1 #import "TentacleView.h"
  2 #import "GesturePasswordButton.h"
  3 
  4 @implementation TentacleView {
  5     CGPoint lineStartPoint;
  6     CGPoint lineEndPoint;
  7     
  8     NSMutableArray * touchesArray;
  9     NSMutableArray * touchedArray;
 10     BOOL success;
 11 }
 12 @synthesize buttonArray;
 13 @synthesize rerificationDelegate;
 14 @synthesize resetDelegate;
 15 @synthesize touchBeginDelegate;
 16 @synthesize style;
 17 
 18 - (id)initWithFrame:(CGRect)frame
 19 {
 20     self = [super initWithFrame:frame];
 21     if (self) {
 22         // Initialization code
 23         touchesArray = [[NSMutableArray alloc]initWithCapacity:0];
 24         touchedArray = [[NSMutableArray alloc]initWithCapacity:0];
 25         [self setBackgroundColor:[UIColor clearColor]];
 26         [self setUserInteractionEnabled:YES];
 27         success = 1;
 28     }
 29     return self;
 30 }
 31 
 32 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
 33     CGPoint touchPoint;
 34     UITouch *touch = [touches anyObject];
 35     [touchesArray removeAllObjects];
 36     [touchedArray removeAllObjects];
 37     [touchBeginDelegate gestureTouchBegin];
 38     success=1;
 39     if (touch) {
 40         touchPoint = [touch locationInView:self];
 41         for (int i=0; i<buttonArray.count; i++) {
 42             GesturePasswordButton * buttonTemp = ((GesturePasswordButton *)[buttonArray objectAtIndex:i]);
 43             [buttonTemp setSuccess:YES];
 44             [buttonTemp setSelected:NO];
 45             if (CGRectContainsPoint(buttonTemp.frame,touchPoint)) {
 46                 CGRect frameTemp = buttonTemp.frame;
 47                 CGPoint point = CGPointMake(frameTemp.origin.x+frameTemp.size.width/2,frameTemp.origin.y+frameTemp.size.height/2);
 48                 NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%f",point.x],@"x",[NSString stringWithFormat:@"%f",point.y],@"y", nil];
 49                 [touchesArray addObject:dict];
 50                 lineStartPoint = touchPoint;
 51             }
 52             [buttonTemp setNeedsDisplay];
 53         }
 54         
 55         [self setNeedsDisplay];
 56     }
 57 }
 58 
 59 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
 60     CGPoint touchPoint;
 61     UITouch *touch = [touches anyObject];
 62     if (touch) {
 63         touchPoint = [touch locationInView:self];
 64         for (int i=0; i<buttonArray.count; i++) {
 65             GesturePasswordButton * buttonTemp = ((GesturePasswordButton *)[buttonArray objectAtIndex:i]);
 66             if (CGRectContainsPoint(buttonTemp.frame,touchPoint)) {
 67                 if ([touchedArray containsObject:[NSString stringWithFormat:@"num%d",i]]) {
 68                     lineEndPoint = touchPoint;
 69                     [self setNeedsDisplay];
 70                     return;
 71                 }
 72                 [touchedArray addObject:[NSString stringWithFormat:@"num%d",i]];
 73                 [buttonTemp setSelected:YES];
 74                 [buttonTemp setNeedsDisplay];
 75                 CGRect frameTemp = buttonTemp.frame;
 76                 CGPoint point = CGPointMake(frameTemp.origin.x+frameTemp.size.width/2,frameTemp.origin.y+frameTemp.size.height/2);
 77                 NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%f",point.x],@"x",[NSString stringWithFormat:@"%f",point.y],@"y",[NSString stringWithFormat:@"%d",i],@"num", nil];
 78                 [touchesArray addObject:dict];
 79                 break;
 80             }
 81         }
 82         lineEndPoint = touchPoint;
 83         [self setNeedsDisplay];
 84     }
 85 }
 86 
 87 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
 88     NSMutableString * resultString=[NSMutableString string];
 89     for ( NSDictionary * num in touchesArray ){
 90         if(![num objectForKey:@"num"])break;
 91         [resultString appendString:[num objectForKey:@"num"]];
 92     }
 93     if(style==1){
 94         success = [rerificationDelegate verification:resultString];
 95     }
 96     else {
 97         success = [resetDelegate resetPassword:resultString];
 98     }
 99     
100     for (int i=0; i<touchesArray.count; i++) {
101         NSInteger selection = [[[touchesArray objectAtIndex:i] objectForKey:@"num"]intValue];
102         GesturePasswordButton * buttonTemp = ((GesturePasswordButton *)[buttonArray objectAtIndex:selection]);
103         [buttonTemp setSuccess:success];
104         [buttonTemp setNeedsDisplay];
105     }
106     [self setNeedsDisplay];
107 }
108 
109 // Only override drawRect: if you perform custom drawing.
110 // An empty implementation adversely affects performance during animation.
111 - (void)drawRect:(CGRect)rect
112 {
113     // Drawing code
114 //    if (touchesArray.count<2)return;
115     for (int i=0; i<touchesArray.count; i++) {
116         CGContextRef context = UIGraphicsGetCurrentContext();
117         if (![[touchesArray objectAtIndex:i] objectForKey:@"num"]) { //防止过快滑动产生垃圾数据
118             [touchesArray removeObjectAtIndex:i];
119             continue;
120         }
121         if (success) {
122             CGContextSetRGBStrokeColor(context, 2/255.f, 174/255.f, 240/255.f, 0.7);//线条颜色
123         }
124         else {
125             CGContextSetRGBStrokeColor(context, 208/255.f, 36/255.f, 36/255.f, 0.7);//红色
126         }
127         
128         CGContextSetLineWidth(context,5);
129         CGContextMoveToPoint(context, [[[touchesArray objectAtIndex:i] objectForKey:@"x"] floatValue], [[[touchesArray objectAtIndex:i] objectForKey:@"y"] floatValue]);
130         if (i<touchesArray.count-1) {
131             CGContextAddLineToPoint(context, [[[touchesArray objectAtIndex:i+1] objectForKey:@"x"] floatValue],[[[touchesArray objectAtIndex:i+1] objectForKey:@"y"] floatValue]);
132         }
133         else{
134             if (success) {
135                 CGContextAddLineToPoint(context, lineEndPoint.x,lineEndPoint.y);
136             }
137         }
138         CGContextStrokePath(context);
139     }
140 }
141 
142 - (void)enterArgin {
143     [touchesArray removeAllObjects];
144     [touchedArray removeAllObjects];
145     for (int i=0; i<buttonArray.count; i++) {
146         GesturePasswordButton * buttonTemp = ((GesturePasswordButton *)[buttonArray objectAtIndex:i]);
147         [buttonTemp setSelected:NO];
148         [buttonTemp setSuccess:YES];
149         [buttonTemp setNeedsDisplay];
150     }
151     
152     [self setNeedsDisplay];
153 }

四:自定义一个密码按钮的View

GesturePasswordButton.h  
1 #import <UIKit/UIKit.h>
2 
3 @interface GesturePasswordButton : UIView
4 
5 @property (nonatomic,assign) BOOL selected;
6 
7 @property (nonatomic,assign) BOOL success;
8 
9 @end
GesturePasswordButton.m
 1 #import "GesturePasswordButton.h"
 2 
 3 #define bounds self.bounds
 4 
 5 @implementation GesturePasswordButton
 6 @synthesize selected;
 7 @synthesize success;
 8 
 9 - (id)initWithFrame:(CGRect)frame
10 {
11     self = [super initWithFrame:frame];
12     if (self) {
13         // Initialization code
14         success=YES;
15         [self setBackgroundColor:[UIColor clearColor]];
16     }
17     return self;
18 }
19 
20 
21 // Only override drawRect: if you perform custom drawing.
22 // An empty implementation adversely affects performance during animation.
23 - (void)drawRect:(CGRect)rect
24 {
25     // Drawing code
26     CGContextRef context = UIGraphicsGetCurrentContext();
27     
28     if (selected) {
29         if (success) {
30             CGContextSetRGBStrokeColor(context, 2/255.f, 174/255.f, 240/255.f,1);//线条颜色
31             CGContextSetRGBFillColor(context,2/255.f, 174/255.f, 240/255.f,1);
32         }
33         else {
34             CGContextSetRGBStrokeColor(context, 208/255.f, 36/255.f, 36/255.f,1);//线条颜色
35             CGContextSetRGBFillColor(context,208/255.f, 36/255.f, 36/255.f,1);
36         }
37         CGRect frame = CGRectMake(bounds.size.width/2-bounds.size.width/8+1, bounds.size.height/2-bounds.size.height/8, bounds.size.width/4, bounds.size.height/4);
38         
39         CGContextAddEllipseInRect(context,frame);
40         CGContextFillPath(context);
41     }
42     else{
43         CGContextSetRGBStrokeColor(context, 1,1,1,1);//线条颜色
44     }
45     
46     CGContextSetLineWidth(context,2);
47     CGRect frame = CGRectMake(2, 2, bounds.size.width-3, bounds.size.height-3);
48     CGContextAddEllipseInRect(context,frame);
49     CGContextStrokePath(context);
50     if (success) {
51         CGContextSetRGBFillColor(context,30/255.f, 175/255.f, 235/255.f,0.3);
52     }
53     else {
54         CGContextSetRGBFillColor(context,208/255.f, 36/255.f, 36/255.f,0.3);
55     }
56     CGContextAddEllipseInRect(context,frame);
57     if (selected) {
58         CGContextFillPath(context);
59     }
60     
61 }
62 
63 
64 @end

五:前面的步骤都准备好了之后,我们就需要在控制器里面实现相应的代码

GesturePasswordController.h
 1 #import <UIKit/UIKit.h>
 2 #import "TentacleView.h"
 3 #import "GesturePasswordView.h"
 4 
 5 @interface GesturePasswordController : UIViewController <VerificationDelegate,ResetDelegate,GesturePasswordDelegate>
 6 
 7 - (void)clear;
 8 
 9 - (BOOL)exist;
10 
11 @end
GesturePasswordController.m
  1 #import <Security/Security.h>
  2 #import <CoreFoundation/CoreFoundation.h>
  3 
  4 #import "GesturePasswordController.h"
  5 
  6 
  7 #import "KeychainItemWrapper/KeychainItemWrapper.h"
  8 
  9 @interface GesturePasswordController ()
 10 
 11 @property (nonatomic,strong) GesturePasswordView * gesturePasswordView;
 12 
 13 @end
 14 
 15 @implementation GesturePasswordController {
 16     NSString * previousString;
 17     NSString * password;
 18 }
 19 
 20 @synthesize gesturePasswordView;
 21 
 22 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
 23 {
 24     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
 25     if (self) {
 26         // Custom initialization
 27     }
 28     return self;
 29 }
 30 
 31 - (void)viewDidLoad
 32 {
 33     [super viewDidLoad];
 34     // Do any additional setup after loading the view.
 35     previousString = [NSString string];
 36     KeychainItemWrapper * keychin = [[KeychainItemWrapper alloc]initWithIdentifier:@"Gesture" accessGroup:nil];
 37     password = [keychin objectForKey:(__bridge id)kSecValueData];
 38     if ([password isEqualToString:@""]) {
 39         
 40         [self reset];
 41     }
 42     else {
 43         [self verify];
 44     }
 45 }
 46 
 47 - (void)didReceiveMemoryWarning
 48 {
 49     [super didReceiveMemoryWarning];
 50     // Dispose of any resources that can be recreated.
 51 }
 52 
 53 
 54 #pragma mark - 验证手势密码
 55 - (void)verify{
 56     gesturePasswordView = [[GesturePasswordView alloc]initWithFrame:[UIScreen mainScreen].bounds];
 57     [gesturePasswordView.tentacleView setRerificationDelegate:self];
 58     [gesturePasswordView.tentacleView setStyle:1];
 59     [gesturePasswordView setGesturePasswordDelegate:self];
 60     [self.view addSubview:gesturePasswordView];
 61 }
 62 
 63 #pragma mark - 重置手势密码
 64 - (void)reset{
 65     gesturePasswordView = [[GesturePasswordView alloc]initWithFrame:[UIScreen mainScreen].bounds];
 66     [gesturePasswordView.tentacleView setResetDelegate:self];
 67     [gesturePasswordView.tentacleView setStyle:2];
 68 //    [gesturePasswordView.imgView setHidden:YES];
 69     [gesturePasswordView.forgetButton setHidden:YES];
 70     [gesturePasswordView.changeButton setHidden:YES];
 71     [self.view addSubview:gesturePasswordView];
 72 }
 73 
 74 #pragma mark - 判断是否已存在手势密码
 75 - (BOOL)exist{
 76     KeychainItemWrapper * keychin = [[KeychainItemWrapper alloc]initWithIdentifier:@"Gesture" accessGroup:nil];
 77     password = [keychin objectForKey:(__bridge id)kSecValueData];
 78     if ([password isEqualToString:@""])return NO;
 79     return YES;
 80 }
 81 
 82 #pragma mark - 清空记录
 83 - (void)clear{
 84     KeychainItemWrapper * keychin = [[KeychainItemWrapper alloc]initWithIdentifier:@"Gesture" accessGroup:nil];
 85     [keychin resetKeychainItem];
 86 }
 87 
 88 #pragma mark - 改变手势密码
 89 - (void)change{
 90 }
 91 
 92 #pragma mark - 忘记手势密码
 93 - (void)forget{
 94 }
 95 
 96 - (BOOL)verification:(NSString *)result{
 97     if ([result isEqualToString:password]) {
 98         [gesturePasswordView.state setTextColor:[UIColor colorWithRed:2/255.f green:174/255.f blue:240/255.f alpha:1]];
 99         [gesturePasswordView.state setText:@"输入正确"];
100         //[self presentViewController:(UIViewController) animated:YES completion:nil];
101         return YES;
102     }
103     [gesturePasswordView.state setTextColor:[UIColor redColor]];
104     [gesturePasswordView.state setText:@"手势密码错误"];
105     return NO;
106 }
107 
108 - (BOOL)resetPassword:(NSString *)result{
109     if ([previousString isEqualToString:@""]) {
110         previousString=result;
111         [gesturePasswordView.tentacleView enterArgin];
112         [gesturePasswordView.state setTextColor:[UIColor colorWithRed:2/255.f green:174/255.f blue:240/255.f alpha:1]];
113         [gesturePasswordView.state setText:@"请验证输入密码"];
114         return YES;
115     }
116     else {
117         if ([result isEqualToString:previousString]) {
118             KeychainItemWrapper * keychin = [[KeychainItemWrapper alloc]initWithIdentifier:@"Gesture" accessGroup:nil];
119             [keychin setObject:@"<帐号>" forKey:(__bridge id)kSecAttrAccount];
120             [keychin setObject:result forKey:(__bridge id)kSecValueData];
121             //[self presentViewController:(UIViewController) animated:YES completion:nil];
122             [gesturePasswordView.state setTextColor:[UIColor colorWithRed:2/255.f green:174/255.f blue:240/255.f alpha:1]];
123             [gesturePasswordView.state setText:@"已保存手势密码"];
124             return YES;
125         }
126         else{
127             previousString =@"";
128             [gesturePasswordView.state setTextColor:[UIColor redColor]];
129             [gesturePasswordView.state setText:@"两次密码不一致,请重新输入"];
130             return NO;
131         }
132     }
133 }
134 
135 
136 
137 
138 /*
139 #pragma mark - Navigation
140 
141 // In a storyboard-based application, you will often want to do a little preparation before navigation
142 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
143 {
144     // Get the new view controller using [segue destinationViewController].
145     // Pass the selected object to the new view controller.
146 }
147 */

六:最终运行效果如下

技术分享  技术分享

 

 

 

 

 

 

 

 

 

 

 

 

iOS开发——高级技术&密码锁功能的实现

标签:

原文地址:http://www.cnblogs.com/iCocos/p/4598581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!