// // HDLGestureLockView.m // HDL_Widget_iOS // // Created by HDL on 2019/10/30. // Copyright © 2019 JLChen. All rights reserved. // #import "HDLGestureLockView.h" #import "HDLUtlisXM.h" #define SSGestureLock_ButtonSize CGSizeMake(20,20)//没有选择按钮的大小 #define SSGestureLock_SelectedButtonSize CGSizeMake(60,60)//选择后按钮的大小 #define SSGestureLock_SelectedLineColor HEXCOLOR(0xFC744B)//选择时候线的颜色 #define SSGestureLock_SelectedErrorLineColor HEXCOLOR(0xFF0000) //选择后错误线的颜色 //#define SSGestureLock_NomarlColor HEXCOLOR(0xD5DBE8) #define SSGestureLock_BorderColor HEXCOLOR(0x818181) #define SSGestureLock_NomarlColor HEXCOLOR(0xC0C7D4) CGFloat const SSGestureLock_DrawLineWidth = 2; //画线的宽度 CGFloat const SSGestureLock_ButtonSpaceH = 30; //横向间隔 CGFloat const SSGestureLock_ButtonSpaceV = 30; //纵向间隔 NSInteger const SSGestureLock_EachNum = 3; NSInteger const SSGestureLock_ButtonCount = 9; typedef NS_ENUM(NSInteger, SSGestureLockKeyType) { SSGestureLockKeyNormalType, SSGestureLockKeySelectedType, SSGestureLockKeyErrorType, }; @interface SSGestureLockKeyView:UIView @property (nonatomic, assign) SSGestureLockKeyType keyType; @property (nonatomic, strong) UIView *smallView; @property (nonatomic, strong) UIColor *errorColor; @property (nonatomic, strong) UIColor *normalColor; @property (nonatomic, strong) UIColor *selectedColor; @property (nonatomic, strong) UIColor *selectedColor_Alpha; @property (nonatomic, strong) UIColor *errorColor_Alpha; @property (nonatomic, assign) BOOL isSolidType; @end @implementation SSGestureLockKeyView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; _smallView = [UIView new]; [self addSubview:_smallView]; } return self; } - (void)layoutSubviews{ [super layoutSubviews]; ///根据大小来设置圆角 self.layer.cornerRadius = self.frame.size.height/2; self.layer.masksToBounds = true; // self.layer.borderWidth = 1.0f; // self.layer.borderColor = SSGestureLock_BorderColor.CGColor; CGFloat smallView_x = CGRectGetWidth(self.frame)*1/3; CGFloat smallView_y = CGRectGetWidth(self.frame)*1/3; CGFloat smallView_width = CGRectGetWidth(self.frame)*1/3; self.smallView.frame = CGRectMake(smallView_x, smallView_y, smallView_width, smallView_width); self.smallView.layer.cornerRadius = self.smallView.frame.size.height/2; if(_isSolidType){ self.smallView.backgroundColor = self.normalColor; }else{ self.layer.borderWidth = 1.0f; self.layer.borderColor = SSGestureLock_BorderColor.CGColor; } } - (void)setErrorColor:(UIColor *)errorColor{ _errorColor = errorColor; _errorColor_Alpha = [self getNewColorWith:errorColor newAlpha:0.2F]; } - (void)setNormalColor:(UIColor *)normalColor{ _normalColor = normalColor; // self.smallView.backgroundColor = _normalColor; } - (void)setSelectedColor:(UIColor *)selectedColor{ _selectedColor = selectedColor; _selectedColor_Alpha = [self getNewColorWith:selectedColor newAlpha:0.2F]; } // 改变UIColor的Alpha - (UIColor *)getNewColorWith:(UIColor *)color newAlpha:(float)newAlpha{ CGFloat red = 0.0; CGFloat green = 0.0; CGFloat blue = 0.0; CGFloat alpha = 0.0; [color getRed:&red green:&green blue:&blue alpha:&alpha]; UIColor *newColor = [UIColor colorWithRed:red green:green blue:blue alpha:newAlpha]; return newColor; } - (void)setKeyType:(SSGestureLockKeyType)keyType{ _keyType = keyType; if(!_isSolidType){ if (_keyType == SSGestureLockKeyNormalType) { // self.backgroundColor = [UIColor clearColor]; self.smallView.backgroundColor = [UIColor clearColor]; self.layer.borderColor = SSGestureLock_BorderColor.CGColor; } if (_keyType == SSGestureLockKeySelectedType) { // self.backgroundColor = self.normalColor; self.smallView.backgroundColor = self.selectedColor; self.layer.borderColor = self.selectedColor.CGColor; } if (_keyType == SSGestureLockKeyErrorType) { // self.backgroundColor = self.normalColor; self.smallView.backgroundColor = self.errorColor; self.layer.borderColor = self.errorColor.CGColor; } }else{ if (_keyType == SSGestureLockKeyNormalType) { self.smallView.backgroundColor = self.normalColor; self.backgroundColor = [UIColor clearColor]; // self.layer.borderColor = SSOnGestureLock_BorderColor.CGColor; } if (_keyType == SSGestureLockKeySelectedType) { self.smallView.backgroundColor = self.selectedColor; // self.layer.borderColor = self.selectedColor.CGColor; self.backgroundColor = self.selectedColor_Alpha; } if (_keyType == SSGestureLockKeyErrorType) { self.smallView.backgroundColor = self.errorColor; self.backgroundColor = self.errorColor_Alpha; // self.layer.borderColor = self.errorColor.CGColor; } } } @end @interface HDLGestureLockView () @property (nonatomic, strong) NSMutableArray * keyViewArray; @property (nonatomic, strong) NSMutableArray *selectedKeyViewArray; @property (nonatomic, assign) CGPoint movePoint; @property (nonatomic, strong) CAShapeLayer *drawLayer; @property (nonatomic, assign) BOOL isSolidType; //是否为实心圆点的手势解锁类型 @end @implementation HDLGestureLockView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.lineWidth = SSGestureLock_DrawLineWidth; self.errorLineColor = SSGestureLock_SelectedErrorLineColor; self.selectedLineColor = SSGestureLock_SelectedLineColor; self.horizontalSpace = SSGestureLock_ButtonSpaceH; self.verticalSpace = SSGestureLock_ButtonSpaceV; self.normalColor = SSGestureLock_NomarlColor; [self setViews]; } return self; } - (CAShapeLayer *)drawLayer{ if (!_drawLayer) { _drawLayer = [CAShapeLayer layer]; _drawLayer.fillColor = [UIColor clearColor].CGColor; _drawLayer.lineWidth = self.lineWidth; _drawLayer.lineJoin = @"round"; [self.layer addSublayer:_drawLayer]; } return _drawLayer; } - (NSMutableArray *)keyViewArray{ if (!_keyViewArray) { _keyViewArray = @[].mutableCopy; } return _keyViewArray; } - (NSMutableArray *)selectedKeyViewArray{ if (!_selectedKeyViewArray) { _selectedKeyViewArray = @[].mutableCopy; } return _selectedKeyViewArray; } - (void)setHorizontalSpace:(CGFloat)horizontalSpace{ _horizontalSpace = horizontalSpace; [self setNeedsLayout]; } - (void)setVerticalSpace:(CGFloat)verticalSpace{ _verticalSpace = verticalSpace; [self setNeedsLayout]; } - (void)setErrorLineColor:(UIColor *)errorLineColor{ _errorLineColor = errorLineColor; for (SSGestureLockKeyView *view in self.keyViewArray) { view.errorColor = errorLineColor; } } - (void)setSelectedLineColor:(UIColor *)selectedLineColor{ _selectedLineColor = selectedLineColor; for (SSGestureLockKeyView *view in self.keyViewArray) { view.selectedColor = selectedLineColor; } } - (void)setNormalColor:(UIColor *)normalColor{ _normalColor = normalColor; for (SSGestureLockKeyView *view in self.keyViewArray) { view.normalColor = normalColor; } } - (void)setShowErrorStatus:(BOOL)showErrorStatus{ _showErrorStatus = showErrorStatus; } - (void)layoutSubviews{ [super layoutSubviews]; CGFloat keyViewWidth = (CGRectGetWidth(self.frame)- (SSGestureLock_EachNum-1)*self.horizontalSpace)/SSGestureLock_EachNum; CGFloat keyViewHeight = (CGRectGetHeight(self.frame)- (SSGestureLock_EachNum-1)*self.verticalSpace)/SSGestureLock_EachNum; for (NSUInteger i=0; i0) { UIBezierPath *bezierPath = [UIBezierPath bezierPath]; SSGestureLockKeyView *firstKeyView = [self.selectedKeyViewArray objectAtIndex:0]; [bezierPath moveToPoint:firstKeyView.center]; if (self.showErrorStatus) { self.drawLayer.strokeColor = self.errorLineColor.CGColor; }else{ self.drawLayer.strokeColor = self.selectedLineColor.CGColor; } for (int i = 0; i < [self.selectedKeyViewArray count]; i++) { SSGestureLockKeyView *KeyView = [self.selectedKeyViewArray objectAtIndex:i]; if (!self.showErrorStatus) { KeyView.keyType = SSGestureLockKeySelectedType; }else{ KeyView.keyType = SSGestureLockKeyErrorType; } [bezierPath addLineToPoint:KeyView.center]; } if (!CGPointEqualToPoint(self.movePoint, CGPointZero)) { [bezierPath addLineToPoint:self.movePoint]; } self.drawLayer.path = bezierPath.CGPath; }else{ [self.drawLayer removeFromSuperlayer]; self.drawLayer = nil; } // Drawing code } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; CGPoint locationPoint = [touch locationInView:self]; SSGestureLockKeyView *keyView = [self returnContainKeyViewWithPoint:locationPoint]; if (keyView) { [self.selectedKeyViewArray addObject:keyView]; } [self setNeedsDisplay]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; CGPoint locationPoint = [touch locationInView:self]; if (CGRectContainsPoint(CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), locationPoint)) { SSGestureLockKeyView *keyView = [self returnContainKeyViewWithPoint:locationPoint]; if (keyView&&![self.selectedKeyViewArray containsObject:keyView]) { [self.selectedKeyViewArray addObject:keyView]; } self.movePoint = locationPoint; [self setNeedsDisplay]; } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ if ([self.delegate respondsToSelector:@selector(didSelectedGestureLockView:selectCount:)]) { [self.delegate didSelectedGestureLockView:[self returnKeyNumStr] selectCount:[self.selectedKeyViewArray count]]; } if (self.showErrorStatus) { [self ss_changeSelectedKeyViewWithKeytype:SSGestureLockKeyErrorType]; [self setNeedsDisplay]; } dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.selectedKeyViewArray removeAllObjects]; self.movePoint = CGPointZero; [self setNeedsDisplay]; [self ss_changeAllKeyViewWithKeytype:SSGestureLockKeyNormalType]; self.showErrorStatus = NO; }); } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ [self.selectedKeyViewArray removeAllObjects]; self.movePoint = CGPointZero; [self setNeedsDisplay]; [self ss_changeAllKeyViewWithKeytype:SSGestureLockKeyNormalType]; } #pragma mark - 根据坐标找出所在的keyView - (SSGestureLockKeyView *)returnContainKeyViewWithPoint:(CGPoint)point{ SSGestureLockKeyView *tempView = nil; for (SSGestureLockKeyView *keyView in self.keyViewArray) { if (CGRectContainsPoint(keyView.frame, point)) { tempView = keyView; break; } } return tempView; } #pragma mark - 还原所有keyView的状态 - (void)ss_changeAllKeyViewWithKeytype:(SSGestureLockKeyType)keyType{ for (SSGestureLockKeyView *keyView in self.keyViewArray) { if (keyView.keyType != keyType) { keyView.keyType = keyType; } } } - (void)ss_changeSelectedKeyViewWithKeytype:(SSGestureLockKeyType)keyType{ for (SSGestureLockKeyView *keyView in self.selectedKeyViewArray) { if (keyView.keyType != keyType) { keyView.keyType = keyType; } } } - (NSString *)returnKeyNumStr{ NSString *keyNumStr = @""; for (int i = 0; i < [self.selectedKeyViewArray count]; i++) { SSGestureLockKeyView *KeyView = [self.selectedKeyViewArray objectAtIndex:i]; keyNumStr = [keyNumStr stringByAppendingString:[NSString stringWithFormat:@"%ld",KeyView.tag]]; } return keyNumStr; } /** 重置布局 @param mCGRect 布局 */ -(void)initWithFrameLockView:(CGRect) mCGRect{ self.frame = mCGRect; // [self refreshFrame]; int mSpace = self.frame.size.width/(2*SSGestureLock_EachNum - 1); self.horizontalSpace = mSpace; self.verticalSpace = mSpace; //// [self refreshFrame]; } /// 2020-06-17 /// 设置实心模式 /// @param isSolidType 是否 -(void)setSolidType:(BOOL)isSolidType{ self.isSolidType = isSolidType; [self resetViews]; } /// 重置view - (void)resetViews{ //移除所有子view for(UIView *view in [self subviews]) { [view removeFromSuperview]; } [_keyViewArray removeAllObjects]; [self setViews]; } @end