@end
@implementation BeyondViewController
#pragma mark - LockView代理方法
// 用於獲知,用戶在LockView上畫的解鎖路徑
- (void)lockView:(LockView *)lockView didFinishPath:(NSString *)path
{
[MBProgressHUD showSuccess:path];
NSLog(@"獲得用戶的手勢路徑:%@", path);
}
@end
自定義CircleButton
//
// Circle.m
// 39_觸摸解鎖
//
// Created by beyond on 14-9-17.
// Copyright (c) 2014年 com.beyond. All rights reserved.
//
#import "Circle.h"
@implementation Circle
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// 自定義方法,初始化
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
// 自定義方法,初始化
[self setup];
}
return self;
}
// 自定義方法,初始化
- (void)setup
{
// 設置按鈕不可用(不可點擊)
self.userInteractionEnabled = NO;
// 設置默認的背景圖片
[self setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
// 設置選中時的背景圖片(selected)
[self setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
}
@end
LockView定義的協議
//
// LockViewDelegate.h
// 39_觸摸解鎖
//
// Created by beyond on 14-9-17.
// Copyright (c) 2014年 com.beyond. All rights reserved.
// 自定義的LockView的代理必需 遵守的協議
#import
@class LockView;
@protocol LockViewDelegate
@optional
// 鎖屏手勢繪制完成時,調用本方法,通知外界
- (void)lockView:(LockView *)lockView didFinishPath:(NSString *)path;
@end
核心代碼,自定義的LockView
//
// LockView.h
// 39_觸摸解鎖
//
// Created by beyond on 14-9-17.
// Copyright (c) 2014年 com.beyond. All rights reserved.
//
#import
@protocol LockViewDelegate;
@interface LockView : UIView
// 代理,為當前控制器,目的是,解鎖手勢繪制完成後,通知它
@property (nonatomic, weak) IBOutlet id delegate;
@end
//
// LockView.m
// 39_觸摸解鎖
//
// Created by beyond on 14-9-17.
// Copyright (c) 2014年 com.beyond. All rights reserved.
// 重點,核心~~~
#import "LockView.h"
#import "Circle.h"
#import "LockViewDelegate.h"
@interface LockView()
// 數組,記住所有的touchMove經過的circle
@property (nonatomic, strong) NSMutableArray *circleArr;
// 手指一直與屏幕保持觸摸的點,活動的點,用於繪制最後一個circle的中心到 用戶觸摸點的線段
@property (nonatomic, assign) CGPoint activePoint;
@end
@implementation LockView
#pragma mark - 懶加載
// 數組,記住所有的touchMove經過的circle
- (NSMutableArray *)circleArr
{
if (_circleArr == nil) {
_circleArr = [NSMutableArray array];
}
return _circleArr;
}
#pragma mark - 初始化
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// 調用自定義方法,一次性添加所有的按鈕
[self addAllCircles];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]){
// 調用自定義方法,一次性添加所有的按鈕
[self addAllCircles];
}
return self;
}
// 調用自定義方法,一次性添加所有的按鈕
- (void)addAllCircles
{
for (int index = 0; index<9; index++) {
// 創建自定義按鈕,綁定tag目的是,將來用於驗證鎖的順序
Circle *btn = [Circle buttonWithType:UIButtonTypeCustom];
btn.tag = index;
// 添加按鈕
[self addSubview:btn];
}
}
#pragma mark - 父類方法
// 每添加一個circle,就調整一下所有子控件的frame
- (void)layoutSubviews
{
// 必須先調用父類的方法
[super layoutSubviews];
// 遍歷所有的子按鈕,重新調整frame
for (int i = 0; i
storyboard