喜欢交朋友的加:微信号 dwjluck2013
#import "LoginGestureCodeViewController.h" #import "UserModel.h" #import "AppDelegate.h" #import "LoginViewController.h" #define BtnTag 5000 @interface LoginGestureCodeViewController ) @property nonatomic,strong)NSMutableArray *buttonArr;//全部手势按键的数组 @property nonatomic,strong)NSMutableArray *selectorArr;//选中手势按键的数组 @property nonatomic,assign)CGPoint startPoint;//记录开始选中的按键坐标 @property nonatomic,assign)CGPoint endPoint;//记录结束时的手势坐标 @property nonatomic,strong)UIImageView *imageView;//画图所需 @property nonatomic,strong)NSMutableString *handMoveString;//最终手势的字符串 @end @implementation LoginGestureCodeViewController - void)viewWillAppear:BOOL)animated{ [super viewWillAppear:animated]; self.navigationItem.title = @"验证手势"; } - void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = getColorbgColor); if !_buttonArr) { _buttonArr = [[NSMutableArray alloc] initWithCapacity:9]; } self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - 64)]; [self.view addSubview:self.imageView]; //提示label UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake0, SCREEN_HEIGHT/5 - 40 / WIDTH_5S_SCALE, SCREEN_WIDTH, 14/ WIDTH_5S_SCALE)]; textLabel.font = DEF_FontSize_14; textLabel.textColor = getColormainColor); textLabel.textAlignment = NSTextAlignmentCenter; textLabel.text = @"请输入手势密码"; [self.view addSubview:textLabel]; //创建按钮 for int i = 0; i < 3; i++) { for int j = 0; j < 3; j++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; //设置TAG值 if i == 0) { btn.tag = BtnTag + j; }else if i == 1){ btn.tag = BtnTag + 3 + j; }else{ btn.tag = BtnTag + 6 + j; } btn.frame = CGRectMakeSCREEN_WIDTH/6+SCREEN_WIDTH/4*j, SCREEN_HEIGHT/5+SCREEN_WIDTH/4*i, SCREEN_WIDTH/5, SCREEN_WIDTH/5); [btn setImage:[UIImage imageNamed:@"login_shoushi1"] forState:UIControlStateNormal]; [btn setImage:[UIImage imageNamed:@"login_shoushi2"] forState:UIControlStateHighlighted]; btn.imageView.contentMode = UIViewContentModeScaleAspectFit; btn.userInteractionEnabled = NO; [self.buttonArr addObject:btn]; [self.imageView addSubview:btn]; } } //确认按钮 UIButton *commitButton = [[UIButton alloc] initWithFrame:CGRectMake30 / WIDTH_5S_SCALE, SCREEN_HEIGHT - 64 - 40 - 50 / WIDTH_5S_SCALE, SCREEN_WIDTH - 60 / WIDTH_5S_SCALE, 40)]; commitButton.titleLabel.font = DEF_FontSize_18; [commitButton setTitle:@"重置手势" forState:UIControlStateNormal]; [commitButton setTitleColor:getColorwhiteColor) forState:UIControlStateNormal]; [commitButton setBackgroundColor:getColormainColor)]; commitButton.layer.cornerRadius = 5; commitButton.layer.masksToBounds = YES; [commitButton addTarget:self action:@selectorcommitBtnAction) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:commitButton]; } //画线 - UIImage *)drawLine{ UIImage *image = nil; UIColor *col = getColormainColor); //设置画图的大小为imageview的大小 UIGraphicsBeginImageContextself.imageView.frame.size); CGContextRef context = UIGraphicsGetCurrentContext); CGContextSetLineWidthcontext, 2); CGContextSetStrokeColorWithColorcontext, col.CGColor); //设置画线起点 CGContextMoveToPointcontext, self.startPoint.x, self.startPoint.y); //从起点画线到选中的按键中心,并切换画线的起点 for UIButton *btn in self.selectorArr) { CGPoint btnPo = btn.center; CGContextAddLineToPointcontext, btnPo.x, btnPo.y); CGContextMoveToPointcontext, btnPo.x, btnPo.y); } //画移动中的最后一条线 CGContextAddLineToPointcontext, self.endPoint.x, self.endPoint.y); CGContextStrokePathcontext); image = UIGraphicsGetImageFromCurrentImageContext);//画图输出 UIGraphicsEndImageContext);//结束画线 return image; } //开始手势 - void)touchesBegan:NSSet<UITouch *> *)touches withEvent:UIEvent *)event{ self.imageView.image = nil; self.selectorArr = nil; for UIButton *btn in self.buttonArr) { btn.highlighted = NO; } UITouch *touch = [touches anyObject]; if touch) { //记录起点 self.startPoint = [touch locationInView:self.imageView]; for UIButton *btn in self.buttonArr) { //记录按键坐标 CGPoint po = [touch locationInView:btn]; //判断按键坐标是否在手势开始范围内,是则为选中的开始按键 if [btn pointInside:po withEvent:nil]) { [self.selectorArr addObject:btn]; btn.highlighted = YES; //保存起始坐标 self.startPoint = btn.center; } } } } //移动中 - void)touchesMoved:NSSet<UITouch *> *)touches withEvent:UIEvent *)event{ UITouch *touch = [touches anyObject]; if touch) { self.endPoint = [touch locationInView:self.imageView]; for UIButton *btn in self.buttonArr) { CGPoint po = [touch locationInView:btn]; if [btn pointInside:po withEvent:nil]) { BOOL isAdd = YES;//记录是否为重复按键 for UIButton *seBtn in self.selectorArr) { if seBtn == btn) { isAdd = NO;//已经是选中过的按键,不再重复添加 break; } } if isAdd) {//未添加的选中按键,添加并修改状态 [self.selectorArr addObject:btn]; btn.highlighted = YES; } } } } //每次移动过程中都要调用这个方法,把画出的图输出显示 self.imageView.image = [self drawLine]; } //手势结束 - void)touchesEnded:NSSet<UITouch *> *)touches withEvent:UIEvent *)event{ //手势图画消失,打印已选择的数组 self.imageView.image = nil; for UIButton *btn in self.buttonArr) { btn.highlighted = NO; } self.startPoint = CGPointZero; NSMutableString *str = @"".mutableCopy; for UIButton *btn in self.selectorArr) { NSLog@"aaa -- %ld",btn.tag - BtnTag); str = NSMutableString*)[str stringByAppendingString:[NSString stringWithFormat:@"%ld",btn.tag - BtnTag]]; } self.handMoveString = str; // 注:可变代码 NSString *locanHandMove = [UserModel sharedInstanced].handMove; if [locanHandMove isEqualToString:str]) { AppDelegate *appDelegate = AppDelegate *)[[UIApplication sharedApplication]delegate]; [appDelegate loginStateChange]; }else{ ShowMessage@"手势密码错误"); } // //手势图画不消失,打印已选择的数组 // self.startPoint = CGPointZero; // for UIButton *btn in self.selectorArr) { // NSLog@"aaa -- %ld",btn.tag - BtnTag); // } } #pragma mark -- btnAction - void)commitBtnAction{ NSLog@"确认按钮"); // NSLog@"--- %@",self.selectorArr); // for UIButton *btn in self.selectorArr) { // NSLog@"aaa -- %ld",btn.tag - BtnTag); // } // 切换根控制器(可变代码) UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:[[LoginViewController alloc]init]]; [UIApplication sharedApplication].delegate.window.rootViewController = nav; } #pragma mark -- init - NSMutableArray *)selectorArr{ if !_selectorArr) { _selectorArr = [[NSMutableArray alloc] init]; } return _selectorArr; } @end