1. 程式人生 > 程式設計 >iOS實現九宮格連線手勢解鎖

iOS實現九宮格連線手勢解鎖

本文例項為大家分享了iOS實現九宮格連線手勢解鎖的具體程式碼,供大家參考,具體內容如下

Demo下載地址:手勢解鎖

效果圖:

iOS實現九宮格連線手勢解鎖

核心程式碼:

//
// ClockView.m
// 手勢解鎖
//
// Created by llkj on 2017/8/24.
// Copyright © 2017年 LayneCheung. All rights reserved.
//

#import "ClockView.h"

@interface ClockView ()

//存放當前選中的按鈕
@property (nonatomic,strong) NSMutableArray *selectBtnArry;

//當前手指所在點
@property (nonatomic,assign) CGPoint curP;

@end

@implementation ClockView

- (void)awakeFromNib{

 [super awakeFromNib];

 //初始化
 [self setUp];
}

- (NSMutableArray *)selectBtnArry{

 if (_selectBtnArry == nil) {
  _selectBtnArry = [NSMutableArray array];
 }
 return _selectBtnArry;
}

- (void)setUp{

 for (int i = 0; i < 9; i ++) {

  //建立按鈕
  UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

  btn.tag = i;

  btn.userInteractionEnabled = NO;

  [btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];

  [btn setImage:[UIImage imageNamed:@"gesture_node_selected"] forState:UIControlStateSelected];

  [self addSubview:btn];
 }
}

//獲取當前點
- (CGPoint)getCurrentPoint:(NSSet *)point{

 UITouch *touch = [point anyObject];
 return [touch locationInView:self];

}

//返回按鈕
- (UIButton *)btnRectContainsPoint:(CGPoint)point{

 //遍歷brn判斷當前點在不在btn上
 for (UIButton *btn in self.subviews) {
  if (CGRectContainsPoint(btn.frame,point)) {
   return btn;
  }
 }
 return nil;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

 //1.獲取當前點
 CGPoint curP = [self getCurrentPoint:touches];

 //2.判斷當前點在不在btn上
 UIButton *btn = [self btnRectContainsPoint:curP];
 if (btn && btn.selected == NO) {
  btn.selected = YES;

  //儲存選中的按鈕
  [self.selectBtnArry addObject:btn];
 }

}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

 //1.獲取當前點
 CGPoint curP = [self getCurrentPoint:touches];
 self.curP = curP;

 //2.判斷當前點在不在btn上
 UIButton *btn = [self btnRectContainsPoint:curP];
 if (btn && btn.selected == NO) {
  btn.selected = YES;

  //儲存選中的按鈕
  [self.selectBtnArry addObject:btn];
 }
 //重繪
 [self setNeedsDisplay];
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

 NSMutableString *str = [NSMutableString string];
 //1.取消所有選中的按鈕
 for (UIButton *btn in self.selectBtnArry) {
  btn.selected = NO;
  [str appendFormat:@"%ld",btn.tag];
 }
 //2.清空路徑
 [self.selectBtnArry removeAllObjects];
 [self setNeedsDisplay];

 //檢視是否是第一次設定密碼
 NSString *keyPwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"keyPwd"];
 if (!keyPwd) {
  [[NSUserDefaults standardUserDefaults] setObject:str forKey:@"keyPwd"];
  [[NSUserDefaults standardUserDefaults] synchronize];

  UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"第一次設定密碼成功" message:nil delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil,nil];
  [alertV show];
  NSLog(@"第一次輸入密碼");
 }else{

  if ([keyPwd isEqualToString:str]) {
   NSLog(@"密碼正確");
   UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"手勢輸入正確" message:nil delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil,nil];
   [alertV show];


  }else{
   NSLog(@"密碼錯誤");
   UIAlertView *alertV = [[UIAlertView alloc] initWithTitle:@"手勢輸入錯誤" message:nil delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil,nil];
   [alertV show];
  }
 }
 //3.檢視當前選中按鈕的順序
 NSLog(@"選中按鈕順序為:%@",str);
}

- (void)drawRect:(CGRect)rect{

 if (self.selectBtnArry.count) {
  //1.建立路徑
  UIBezierPath *path = [UIBezierPath bezierPath];

  //2.取出所有儲存的按鈕
  for (int i = 0; i < self.selectBtnArry.count; i ++) {
   UIButton *btn = self.selectBtnArry[i];

   //當前按鈕是不是第一個按鈕
   if (i == 0) {
    //設定成路徑的起點
    [path moveToPoint:btn.center];
   } else {
    //新增一根線到按鈕中心
    [path addLineToPoint:btn.center];
   }
  }

  //新增一根線到當前手指所在點
  [path addLineToPoint:self.curP];

  //設定線寬/顏色
  [path setLineWidth:5];
  [[UIColor whiteColor] set];
  [path setLineJoinStyle:kCGLineJoinRound];

  //3.繪製路徑
  [path stroke];
 }


}
- (void)layoutSubviews{

 [super layoutSubviews];

 CGFloat x = 0;
 CGFloat y = 0;

 CGFloat btnWH = 75;

 int column = 3;
 int margin = (self.bounds.size.width - (column * btnWH)) / (column + 1);

 int currentColumn = 0;
 int currentRow = 0;

 for (int i = 0; i < self.subviews.count; i ++) {

  // 求當前所在的列
  currentColumn = i % column;

  // 求當前所在的行
  currentRow = i / column;

  x = margin + (btnWH + margin) * currentColumn;

  y = margin + (btnWH + margin) * currentRow;

  UIButton *btn = self.subviews[i];

  btn.frame = CGRectMake(x,y,btnWH,btnWH);
 }
}
@end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。