iOS 九宮格連線手勢解鎖

Demo下載地址:http://download.csdn.net/download/u010981736/9948271

效果圖:

這裏寫圖片描述

核心代碼:

//
//  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
發佈了55 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章