From b9665f9c533aa9f127aabdcbb7fcdc5f28877322 Mon Sep 17 00:00:00 2001 From: jianpeixin Date: Fri, 27 Dec 2013 23:47:39 +0800 Subject: [PATCH 1/2] * add support for fully control of displaying state of the selected nodes. * add drawSelectionWithPassCode interface to draw the specific passcode directly without using gesture. This is helpful when you use KKGestureLockView as thumbnail gesture lock view. * update README file for more detail about these changes. --- KKGestureLockView.xcodeproj/project.pbxproj | 5 + KKGestureLockView/KKViewController.h | 0 KKGestureLockView/KKViewController.m | 51 ++++++++- KKGestureLockView/Source/KKGestureLockView.h | 18 ++++ KKGestureLockView/Source/KKGestureLockView.m | 108 ++++++++++++------- KKGestureLockView/gesture_node_error@2x.png | Bin 0 -> 15621 bytes README.md | 7 +- 7 files changed, 143 insertions(+), 46 deletions(-) mode change 100644 => 100755 KKGestureLockView/KKViewController.h create mode 100644 KKGestureLockView/gesture_node_error@2x.png diff --git a/KKGestureLockView.xcodeproj/project.pbxproj b/KKGestureLockView.xcodeproj/project.pbxproj index 143da97..1ec0a50 100644 --- a/KKGestureLockView.xcodeproj/project.pbxproj +++ b/KKGestureLockView.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ A399B46A17AF507400ADF304 /* gesture_node_selected.png in Resources */ = {isa = PBXBuildFile; fileRef = A399B46617AF507400ADF304 /* gesture_node_selected.png */; }; A399B46C17AF8FD300ADF304 /* gesture_background.png in Resources */ = {isa = PBXBuildFile; fileRef = A399B46B17AF8FD300ADF304 /* gesture_background.png */; }; A399B47017AF997100ADF304 /* KKGestureLockView.m in Sources */ = {isa = PBXBuildFile; fileRef = A399B46F17AF997100ADF304 /* KKGestureLockView.m */; }; + CC657ADA186D9F2A0009C58E /* gesture_node_error@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CC657AD9186D9F2A0009C58E /* gesture_node_error@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -50,6 +51,7 @@ A399B46B17AF8FD300ADF304 /* gesture_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gesture_background.png; sourceTree = ""; }; A399B46E17AF997100ADF304 /* KKGestureLockView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KKGestureLockView.h; sourceTree = ""; }; A399B46F17AF997100ADF304 /* KKGestureLockView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KKGestureLockView.m; sourceTree = ""; }; + CC657AD9186D9F2A0009C58E /* gesture_node_error@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "gesture_node_error@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -110,6 +112,7 @@ A399B44317AED01800ADF304 /* Supporting Files */ = { isa = PBXGroup; children = ( + CC657AD9186D9F2A0009C58E /* gesture_node_error@2x.png */, A399B46B17AF8FD300ADF304 /* gesture_background.png */, A399B46317AF507400ADF304 /* gesture_node_normal@2x.png */, A399B46417AF507400ADF304 /* gesture_node_normal.png */, @@ -191,6 +194,7 @@ A399B44F17AED01800ADF304 /* Default.png in Resources */, A399B45117AED01800ADF304 /* Default@2x.png in Resources */, A399B45317AED01800ADF304 /* Default-568h@2x.png in Resources */, + CC657ADA186D9F2A0009C58E /* gesture_node_error@2x.png in Resources */, A399B45917AED01800ADF304 /* KKViewController.xib in Resources */, A399B46717AF507400ADF304 /* gesture_node_normal@2x.png in Resources */, A399B46817AF507400ADF304 /* gesture_node_normal.png in Resources */, @@ -333,6 +337,7 @@ A399B45E17AED01800ADF304 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/KKGestureLockView/KKViewController.h b/KKGestureLockView/KKViewController.h old mode 100644 new mode 100755 diff --git a/KKGestureLockView/KKViewController.m b/KKGestureLockView/KKViewController.m index 26ed3cc..6cca133 100644 --- a/KKGestureLockView/KKViewController.m +++ b/KKGestureLockView/KKViewController.m @@ -8,15 +8,20 @@ #import "KKViewController.h" @interface KKViewController () - +@property (nonatomic, assign) NSUInteger tryTimes; +@property (nonatomic, strong) NSString *firstPasscode; @end @implementation KKViewController +- (void)viewWillAppear:(BOOL)animated +{ + self.tryTimes = 0; +} + - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor = [UIColor whiteColor]; self.lockView.normalGestureNodeImage = [UIImage imageNamed:@"gesture_node_normal.png"]; self.lockView.selectedGestureNodeImage = [UIImage imageNamed:@"gesture_node_selected.png"]; @@ -24,6 +29,8 @@ - (void)viewDidLoad self.lockView.lineWidth = 12; self.lockView.delegate = self; self.lockView.contentInsets = UIEdgeInsetsMake(150, 20, 100, 20); + //if set autoResetSelectionState to NO, you need to manage the selection state by yourself. + self.lockView.autoResetSelectionState = NO; } - (void)didReceiveMemoryWarning @@ -32,13 +39,47 @@ - (void)didReceiveMemoryWarning // Dispose of any resources that can be recreated. } +- (void)reset:(KKGestureLockView *)gestureLockView +{ + [gestureLockView resetSelectionState]; + gestureLockView.lineColor = [[UIColor orangeColor] colorWithAlphaComponent:0.3]; + gestureLockView.selectedGestureNodeImage = [UIImage imageNamed:@"gesture_node_selected.png"]; + gestureLockView.userInteractionEnabled = YES; +} - (void)gestureLockView:(KKGestureLockView *)gestureLockView didBeginWithPasscode:(NSString *)passcode{ - NSLog(@"%@",passcode); + NSLog(@"passcode1: %@", passcode); } - (void)gestureLockView:(KKGestureLockView *)gestureLockView didEndWithPasscode:(NSString *)passcode{ - NSLog(@"%@",passcode); -} + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" + message:@"" + delegate:nil + cancelButtonTitle:@"确定" + otherButtonTitles:nil]; + NSLog(@"passcode2: %@", passcode); + if (!gestureLockView.autoResetSelectionState) { + gestureLockView.userInteractionEnabled = NO; + } + if (self.tryTimes == 0) { + self.firstPasscode = passcode; + alert.message = [NSString stringWithFormat:@"第一次输入的密码是:\n%@", passcode]; + [alert show]; + [self reset:gestureLockView]; + } else { + if ([passcode isEqualToString:self.firstPasscode]) { + alert.message = @"两次密码一样!"; + [alert show]; + [self reset:gestureLockView]; + } else { + alert.message = @"两次密码不一样!"; + [alert show]; + UIImage *selectedImage = [UIImage imageNamed:@"gesture_node_error"]; + [gestureLockView redrawOnlySelectionWithLineColor:[UIColor redColor] selectedImage:selectedImage]; + [self performSelector:@selector(reset:) withObject:gestureLockView afterDelay:1]; + } + } + self.tryTimes += 1; +} @end diff --git a/KKGestureLockView/Source/KKGestureLockView.h b/KKGestureLockView/Source/KKGestureLockView.h index eafd44a..6d9fbee 100644 --- a/KKGestureLockView/Source/KKGestureLockView.h +++ b/KKGestureLockView/Source/KKGestureLockView.h @@ -17,6 +17,8 @@ - (void)gestureLockView:(KKGestureLockView *)gestureLockView didEndWithPasscode:(NSString *)passcode; - (void)gestureLockView:(KKGestureLockView *)gestureLockView didCanceledWithPasscode:(NSString *)passcode; + + @end @interface KKGestureLockView : UIView @@ -29,10 +31,26 @@ @property (nonatomic, strong) UIColor *lineColor; @property (nonatomic, assign) CGFloat lineWidth; +@property (nonatomic, assign) CGSize nodeSize; @property (nonatomic, strong, readonly) UIView *contentView;//the container of the gesture notes @property (nonatomic, assign) UIEdgeInsets contentInsets; +//autoResetSelectionState desides whether to reset the selection state to origin. +@property (nonatomic, assign) BOOL autoResetSelectionState; //default is YES @property (nonatomic, weak) id delegate; + +- (void)resetSelectionState; +/* + Important: redrawOnlySelectionWithLineColor has side-effect that it will modify + the lineColor and selectedImage, so you should reset gestureLockView's + lineColor and selectedImage to original one manually. + */ +- (void)redrawOnlySelectionWithLineColor:(UIColor *)lineColor selectedImage:(UIImage *)selectedImage; + +/* + drawSelectionWithPassCode helps to draw passcode on gestureLockView, e.g. thumbnailGestureLockView(手势密码的缩略图) + */ +- (void)drawSelectionWithPassCode:(NSString *)passCode; @end diff --git a/KKGestureLockView/Source/KKGestureLockView.m b/KKGestureLockView/Source/KKGestureLockView.m index 817e390..33555d5 100644 --- a/KKGestureLockView/Source/KKGestureLockView.m +++ b/KKGestureLockView/Source/KKGestureLockView.m @@ -27,7 +27,6 @@ @interface KKGestureLockView (){ @property (nonatomic, strong) UIView *contentView; //Implement nodes with buttons -@property (nonatomic, assign) CGSize buttonSize; @property (nonatomic, strong) NSArray *buttons; @property (nonatomic, strong) NSMutableArray *selectedButtons; @@ -73,11 +72,13 @@ - (void)_lockViewInitialize{ self.contentView = [[UIView alloc] initWithFrame:UIEdgeInsetsInsetRect(self.bounds, self.contentInsets)]; self.contentView.backgroundColor = [UIColor clearColor]; [self addSubview:self.contentView]; - - self.buttonSize = CGSizeMake(kNodeDefaultWidth, kNodeDefaultHeight); - - self.normalGestureNodeImage = [self imageWithColor:[UIColor greenColor] size:self.buttonSize]; - self.selectedGestureNodeImage = [self imageWithColor:[UIColor redColor] size:self.buttonSize]; + + if (CGSizeEqualToSize(self.nodeSize, CGSizeZero)) { + self.nodeSize = CGSizeMake(kNodeDefaultWidth, kNodeDefaultHeight); + } + + self.normalGestureNodeImage = [self imageWithColor:[UIColor greenColor] size:self.nodeSize]; + self.selectedGestureNodeImage = [self imageWithColor:[UIColor redColor] size:self.nodeSize]; self.numberOfGestureNodes = kNumberOfNodes; self.gestureNodesPerRow = kNodesPerRow; @@ -85,8 +86,17 @@ - (void)_lockViewInitialize{ self.selectedButtons = [NSMutableArray array]; self.trackedLocationInContentView = CGPointMake(kTrackedLocationInvalidInContentView, kTrackedLocationInvalidInContentView); + self.autoResetSelectionState = YES; } +- (NSString *)generatePassCode +{ + NSMutableArray *passCodeArray = [NSMutableArray array]; + for (UIButton *button in self.selectedButtons) { + [passCodeArray addObject:[@(button.tag) stringValue]]; + } + return [passCodeArray componentsJoinedByString:@","]; +} #pragma mark - #pragma mark UIView Overrides @@ -110,15 +120,15 @@ - (void)layoutSubviews{ [super layoutSubviews]; self.contentView.frame = UIEdgeInsetsInsetRect(self.bounds, self.contentInsets); - CGFloat horizontalNodeMargin = (self.contentView.bounds.size.width - self.buttonSize.width * self.gestureNodesPerRow)/(self.gestureNodesPerRow - 1); + CGFloat horizontalNodeMargin = (self.contentView.bounds.size.width - self.nodeSize.width * self.gestureNodesPerRow)/(self.gestureNodesPerRow - 1); NSUInteger numberOfRows = ceilf((self.numberOfGestureNodes * 1.0 / self.gestureNodesPerRow)); - CGFloat verticalNodeMargin = (self.contentView.bounds.size.height - self.buttonSize.height *numberOfRows)/(numberOfRows - 1); + CGFloat verticalNodeMargin = (self.contentView.bounds.size.height - self.nodeSize.height *numberOfRows)/(numberOfRows - 1); for (int i = 0; i < self.numberOfGestureNodes ; i++) { int row = i / self.gestureNodesPerRow; int column = i % self.gestureNodesPerRow; UIButton *button = [self.buttons objectAtIndex:i]; - button.frame = CGRectMake(floorf((self.buttonSize.width + horizontalNodeMargin) * column), floorf((self.buttonSize.height + verticalNodeMargin) * row), self.buttonSize.width, self.buttonSize.height); + button.frame = CGRectMake(floorf((self.nodeSize.width + horizontalNodeMargin) * column), floorf((self.nodeSize.height + verticalNodeMargin) * row), self.nodeSize.width, self.nodeSize.height); } } @@ -185,37 +195,30 @@ - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ if ([self.selectedButtons count] > 0) { if (_delegateFlags.didEndWithPasscode) { - NSMutableArray *passcodeArray = [NSMutableArray array]; - for (UIButton *button in self.selectedButtons) { - [passcodeArray addObject:[NSString stringWithFormat:@"%d",button.tag]]; - } - - [self.delegate gestureLockView:self didEndWithPasscode:[passcodeArray componentsJoinedByString:@","]]; + [self.delegate gestureLockView:self didEndWithPasscode:[self generatePassCode]]; } } - - for (UIButton *button in self.selectedButtons) { - button.selected = NO; - } - [self.selectedButtons removeAllObjects]; - self.trackedLocationInContentView = CGPointMake(kTrackedLocationInvalidInContentView, kTrackedLocationInvalidInContentView); - [self setNeedsDisplay]; - + if (self.autoResetSelectionState) { + [self resetSelectionState]; + } } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ if ([self.selectedButtons count] > 0) { if (_delegateFlags.didCanceled) { - NSMutableArray *passcodeArray = [NSMutableArray array]; - for (UIButton *button in self.selectedButtons) { - [passcodeArray addObject:[NSString stringWithFormat:@"%d",button.tag]]; - } - - [self.delegate gestureLockView:self didCanceledWithPasscode:[passcodeArray componentsJoinedByString:@","]]; + [self.delegate gestureLockView:self didCanceledWithPasscode:[self generatePassCode]]; } } - + + if (self.autoResetSelectionState) { + [self resetSelectionState]; + } +} + +#pragma pulic methods +- (void)resetSelectionState +{ for (UIButton *button in self.selectedButtons) { button.selected = NO; } @@ -224,15 +227,40 @@ - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ [self setNeedsDisplay]; } +- (void)redrawOnlySelectionWithLineColor:(UIColor *)lineColor selectedImage:(UIImage *)selectedImage +{ + self.lineColor = lineColor; + self.trackedLocationInContentView = CGPointMake(kTrackedLocationInvalidInContentView, kTrackedLocationInvalidInContentView); + [self setSelectedGestureNodeImage:selectedImage]; + [self setNeedsDisplay]; +} + +- (void)drawSelectionWithPassCode:(NSString *)passCode +{ + NSArray *passCodeArray = [passCode componentsSeparatedByString:@","]; + if (passCodeArray.count <= 0) return; + //clean state first + [self resetSelectionState]; + for (NSString *passCodeUnit in passCodeArray) { + NSInteger buttonTag = [passCodeUnit integerValue]; + if (buttonTag >= 0 && buttonTag < self.buttons.count) { + UIButton *button = self.buttons[buttonTag]; + button.selected = YES; + [self.selectedButtons addObject:button]; + } + } + [self setNeedsDisplay]; +} + #pragma mark - #pragma mark Accessors - (void)setNormalGestureNodeImage:(UIImage *)normalGestureNodeImage{ if (_normalGestureNodeImage != normalGestureNodeImage) { _normalGestureNodeImage = normalGestureNodeImage; - CGSize buttonSize = self.buttonSize; - buttonSize.width = self.buttonSize.width > normalGestureNodeImage.size.width ? self.buttonSize.width : normalGestureNodeImage.size.width; - buttonSize.height = self.buttonSize.height > normalGestureNodeImage.size.height ? self.buttonSize.height : normalGestureNodeImage.size.height; - self.buttonSize = buttonSize; + CGSize nodeSize = self.nodeSize; + nodeSize.width = self.nodeSize.width > normalGestureNodeImage.size.width ? self.nodeSize.width : normalGestureNodeImage.size.width; + nodeSize.height = self.nodeSize.height > normalGestureNodeImage.size.height ? self.nodeSize.height : normalGestureNodeImage.size.height; + self.nodeSize = nodeSize; if (self.buttons != nil && [self.buttons count] > 0) { for (UIButton *button in self.buttons) { @@ -246,10 +274,10 @@ - (void)setSelectedGestureNodeImage:(UIImage *)selectedGestureNodeImage{ if (_selectedGestureNodeImage != selectedGestureNodeImage) { _selectedGestureNodeImage = selectedGestureNodeImage; - CGSize buttonSize = self.buttonSize; - buttonSize.width = self.buttonSize.width > selectedGestureNodeImage.size.width ? self.buttonSize.width : selectedGestureNodeImage.size.width; - buttonSize.height = self.buttonSize.height > selectedGestureNodeImage.size.height ? self.buttonSize.height : selectedGestureNodeImage.size.height; - self.buttonSize = buttonSize; + CGSize nodeSize = self.nodeSize; + nodeSize.width = self.nodeSize.width > selectedGestureNodeImage.size.width ? self.nodeSize.width : selectedGestureNodeImage.size.width; + nodeSize.height = self.nodeSize.height > selectedGestureNodeImage.size.height ? self.nodeSize.height : selectedGestureNodeImage.size.height; + self.nodeSize = nodeSize; if (self.buttons != nil && [self.buttons count] > 0) { for (UIButton *button in self.buttons) { @@ -264,7 +292,7 @@ - (void)setDelegate:(id)delegate{ _delegateFlags.didBeginWithPasscode = [delegate respondsToSelector:@selector(gestureLockView:didBeginWithPasscode:)]; _delegateFlags.didEndWithPasscode = [delegate respondsToSelector:@selector(gestureLockView:didEndWithPasscode:)]; - _delegateFlags.didCanceled = [delegate respondsToSelector:@selector(gestureLockViewCanceled:)]; + _delegateFlags.didCanceled = [delegate respondsToSelector:@selector(gestureLockView:didCanceledWithPasscode:)]; } - (void)setNumberOfGestureNodes:(NSUInteger)numberOfGestureNodes{ @@ -282,7 +310,7 @@ - (void)setNumberOfGestureNodes:(NSUInteger)numberOfGestureNodes{ UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.tag = i; button.userInteractionEnabled = NO; - button.frame = CGRectMake(0, 0, self.buttonSize.width, self.buttonSize.height); + button.frame = CGRectMake(0, 0, self.nodeSize.width, self.nodeSize.height); button.backgroundColor = [UIColor clearColor]; if (self.normalGestureNodeImage != nil) { [button setImage:self.normalGestureNodeImage forState:UIControlStateNormal]; diff --git a/KKGestureLockView/gesture_node_error@2x.png b/KKGestureLockView/gesture_node_error@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..90e55a918c477ab851311fcfdc9b68fd431fe010 GIT binary patch literal 15621 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 fE!_2RS)>0SM2vH literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 219ca9c..2732aae 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ KKGestureLockView是一个非常方便使用的Gesture Lock控件,只需要简 ##用法 -控件的源码在`KKGestureLockView/Source`目录下,且自带了一个仿支付宝解锁界面的例子(例子的图片资源取自支付宝app解压缩后的资源图片): +控件的源码在`KKGestureLockView/Source`目录下,且自带了一个仿支付宝解锁界面的简单例子(例子的图片资源取自支付宝app解压缩后的资源图片): self.lockView.normalGestureNodeImage = [UIImage imageNamed:@"gesture_node_normal.png"]; self.lockView.selectedGestureNodeImage = [UIImage imageNamed:@"gesture_node_selected.png"]; @@ -21,6 +21,11 @@ KKGestureLockView是一个非常方便使用的Gesture Lock控件,只需要简 self.lockView.delegate = self; self.lockView.contentInsets = UIEdgeInsetsMake(150, 20, 100, 20); +如果要自己控制绘制手势之后的节点的显示控制,比如, 如果手势错误需要将节点、节点间的线都变成红色,那么可以这样做(具体用法请参考KKViewController.m)里面的例子: + + UIImage *selectedImage = [UIImage imageNamed:@"gesture_node_error"]; + [self.lockView redrawOnlySelectionWithLineColor:[UIColor redColor] selectedImage:selectedImage]; + 一般情况下9个节点便够用了,当然如果你想多弄些节点也不是不可以: From f2c11b059841d8c7e77af748526af123cc36952f Mon Sep 17 00:00:00 2001 From: jianpeixin Date: Mon, 30 Dec 2013 10:22:01 +0800 Subject: [PATCH 2/2] use private buttonSize property instead of public nodeSize property to constraint node size, now remove nodeSize property. --- KKGestureLockView/Source/KKGestureLockView.h | 1 - KKGestureLockView/Source/KKGestureLockView.m | 33 ++++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/KKGestureLockView/Source/KKGestureLockView.h b/KKGestureLockView/Source/KKGestureLockView.h index 6d9fbee..128c47e 100644 --- a/KKGestureLockView/Source/KKGestureLockView.h +++ b/KKGestureLockView/Source/KKGestureLockView.h @@ -31,7 +31,6 @@ @property (nonatomic, strong) UIColor *lineColor; @property (nonatomic, assign) CGFloat lineWidth; -@property (nonatomic, assign) CGSize nodeSize; @property (nonatomic, strong, readonly) UIView *contentView;//the container of the gesture notes @property (nonatomic, assign) UIEdgeInsets contentInsets; diff --git a/KKGestureLockView/Source/KKGestureLockView.m b/KKGestureLockView/Source/KKGestureLockView.m index 33555d5..05d6c44 100644 --- a/KKGestureLockView/Source/KKGestureLockView.m +++ b/KKGestureLockView/Source/KKGestureLockView.m @@ -27,6 +27,7 @@ @interface KKGestureLockView (){ @property (nonatomic, strong) UIView *contentView; //Implement nodes with buttons +@property (nonatomic, assign) CGSize buttonSize; @property (nonatomic, strong) NSArray *buttons; @property (nonatomic, strong) NSMutableArray *selectedButtons; @@ -73,12 +74,10 @@ - (void)_lockViewInitialize{ self.contentView.backgroundColor = [UIColor clearColor]; [self addSubview:self.contentView]; - if (CGSizeEqualToSize(self.nodeSize, CGSizeZero)) { - self.nodeSize = CGSizeMake(kNodeDefaultWidth, kNodeDefaultHeight); - } + self.buttonSize = CGSizeMake(kNodeDefaultWidth, kNodeDefaultHeight); - self.normalGestureNodeImage = [self imageWithColor:[UIColor greenColor] size:self.nodeSize]; - self.selectedGestureNodeImage = [self imageWithColor:[UIColor redColor] size:self.nodeSize]; + self.normalGestureNodeImage = [self imageWithColor:[UIColor greenColor] size:self.buttonSize]; + self.selectedGestureNodeImage = [self imageWithColor:[UIColor redColor] size:self.buttonSize]; self.numberOfGestureNodes = kNumberOfNodes; self.gestureNodesPerRow = kNodesPerRow; @@ -120,15 +119,15 @@ - (void)layoutSubviews{ [super layoutSubviews]; self.contentView.frame = UIEdgeInsetsInsetRect(self.bounds, self.contentInsets); - CGFloat horizontalNodeMargin = (self.contentView.bounds.size.width - self.nodeSize.width * self.gestureNodesPerRow)/(self.gestureNodesPerRow - 1); + CGFloat horizontalNodeMargin = (self.contentView.bounds.size.width - self.buttonSize.width * self.gestureNodesPerRow)/(self.gestureNodesPerRow - 1); NSUInteger numberOfRows = ceilf((self.numberOfGestureNodes * 1.0 / self.gestureNodesPerRow)); - CGFloat verticalNodeMargin = (self.contentView.bounds.size.height - self.nodeSize.height *numberOfRows)/(numberOfRows - 1); + CGFloat verticalNodeMargin = (self.contentView.bounds.size.height - self.buttonSize.height *numberOfRows)/(numberOfRows - 1); for (int i = 0; i < self.numberOfGestureNodes ; i++) { int row = i / self.gestureNodesPerRow; int column = i % self.gestureNodesPerRow; UIButton *button = [self.buttons objectAtIndex:i]; - button.frame = CGRectMake(floorf((self.nodeSize.width + horizontalNodeMargin) * column), floorf((self.nodeSize.height + verticalNodeMargin) * row), self.nodeSize.width, self.nodeSize.height); + button.frame = CGRectMake(floorf((self.buttonSize.width + horizontalNodeMargin) * column), floorf((self.buttonSize.height + verticalNodeMargin) * row), self.buttonSize.width, self.buttonSize.height); } } @@ -257,10 +256,10 @@ - (void)drawSelectionWithPassCode:(NSString *)passCode - (void)setNormalGestureNodeImage:(UIImage *)normalGestureNodeImage{ if (_normalGestureNodeImage != normalGestureNodeImage) { _normalGestureNodeImage = normalGestureNodeImage; - CGSize nodeSize = self.nodeSize; - nodeSize.width = self.nodeSize.width > normalGestureNodeImage.size.width ? self.nodeSize.width : normalGestureNodeImage.size.width; - nodeSize.height = self.nodeSize.height > normalGestureNodeImage.size.height ? self.nodeSize.height : normalGestureNodeImage.size.height; - self.nodeSize = nodeSize; + CGSize buttonSize = self.buttonSize; + buttonSize.width = self.buttonSize.width > normalGestureNodeImage.size.width ? self.buttonSize.width : normalGestureNodeImage.size.width; + buttonSize.height = self.buttonSize.height > normalGestureNodeImage.size.height ? self.buttonSize.height : normalGestureNodeImage.size.height; + self.buttonSize = buttonSize; if (self.buttons != nil && [self.buttons count] > 0) { for (UIButton *button in self.buttons) { @@ -274,10 +273,10 @@ - (void)setSelectedGestureNodeImage:(UIImage *)selectedGestureNodeImage{ if (_selectedGestureNodeImage != selectedGestureNodeImage) { _selectedGestureNodeImage = selectedGestureNodeImage; - CGSize nodeSize = self.nodeSize; - nodeSize.width = self.nodeSize.width > selectedGestureNodeImage.size.width ? self.nodeSize.width : selectedGestureNodeImage.size.width; - nodeSize.height = self.nodeSize.height > selectedGestureNodeImage.size.height ? self.nodeSize.height : selectedGestureNodeImage.size.height; - self.nodeSize = nodeSize; + CGSize buttonSize = self.buttonSize; + buttonSize.width = self.buttonSize.width > selectedGestureNodeImage.size.width ? self.buttonSize.width : selectedGestureNodeImage.size.width; + buttonSize.height = self.buttonSize.height > selectedGestureNodeImage.size.height ? self.buttonSize.height : selectedGestureNodeImage.size.height; + self.buttonSize = buttonSize; if (self.buttons != nil && [self.buttons count] > 0) { for (UIButton *button in self.buttons) { @@ -310,7 +309,7 @@ - (void)setNumberOfGestureNodes:(NSUInteger)numberOfGestureNodes{ UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.tag = i; button.userInteractionEnabled = NO; - button.frame = CGRectMake(0, 0, self.nodeSize.width, self.nodeSize.height); + button.frame = CGRectMake(0, 0, self.buttonSize.width, self.buttonSize.height); button.backgroundColor = [UIColor clearColor]; if (self.normalGestureNodeImage != nil) { [button setImage:self.normalGestureNodeImage forState:UIControlStateNormal];