//
// Created by wangtouwang on 15/4/7.
// Copyright (c) 2015年 wangtouwang. All rights reserved.
//
#import <UIKit/UIKit.h>
@class YYLockView;
@protocol YYLockViewDelegate <NSObject>
//自定义一个协议
//协议方法,把当前视图作为参数
-(void)LockViewDidClick:(YYLockView *)lockView andPwd:(NSString *)pwd;
@end
@interface YYLockView : UIView
//代理
@property(nonatomic,weak) IBOutlet id<YYLockViewDelegate>delegate;
@end
//
// YYLockView.m
// Created by wangtouwang on 15/4/7.
// Copyright (c) 2015年 wangtouwang. All rights reserved.
//
#import "YYLockView.h"
// 设置获取屏幕长宽全局变量
#define KSCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define KSCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
#define BUTTON_HEIGHT_MIDDLE_WIDTH_RADIO 1.22
@interface YYLockView ()
{
UIView *newView;
}
@property(nonatomic,strong)NSMutableArray *buttons;
@property(nonatomic,strong)NSMutableArray *includButtons;
//定义一个属性,记录当前点
@property(nonatomic,assign)CGPoint currentPoint;
@end
@implementation YYLockView
#pragma mark-懒加载
-(NSMutableArray *)buttons
{
if (_buttons==nil) {
_buttons=[NSMutableArray array];
}
return _buttons;
}
#pragma mark-懒加载
-(NSMutableArray *)includButtons
{
if (_includButtons==nil) {
_includButtons=[NSMutableArray array];
}
return _includButtons;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"断点 B 号 ");
if (self=[super initWithCoder:aDecoder]) {
[self setup];
}
return self;
}
//界面搭建
- (id)initWithFrame:(CGRect)frame
{
NSLog(@"断点 1 号 ");
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
//在界面上创建9个按钮
-(void)setup
{
// NSLog(@"断点 2 号 ");
// newView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
// newView.backgroundColor=[UIColor redColor];
// [self addSubview:newView];
//1.创建9个按钮
for (int i=0; i<9; i++) {
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
//2.设置按钮的状态背景
[btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
[btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
//3.把按钮添加到视图中
[self addSubview:btn];
//将按钮添加到包含按钮数组中
[[self includButtons] addObject:btn];
//4.禁止按钮的点击事件
btn.userInteractionEnabled=NO;
//5.设置每个按钮的tag
btn.tag=i+1;
}
}
//4.设置按钮的frame
-(void)layoutSubviews
{
NSLog(@"断点顺序 3 号 ");
CGFloat inverst = KSCREEN_HEIGHT/4.5;
inverst=0;
//4.1需要先调用父类的方法
[super layoutSubviews];
for (int i=0; i<[self includButtons].count; i++) {
//4.2取出按钮
UIButton *btn=[self includButtons][i];
//4.3九宫格法计算每个按钮的frame
CGFloat row = i/3;
CGFloat loc = i%3;
// NSLog(@"ROW=%f LOC=%f",row,loc);
CGFloat btnW=74;
CGFloat btnH=74;
CGFloat padding=(self.frame.size.width-3*btnW)/4;
CGFloat btnX=padding+(btnW+padding)*loc;
CGFloat btnY=padding*BUTTON_HEIGHT_MIDDLE_WIDTH_RADIO+(btnW+padding)*row;
// NSLog(@"BTNX-%f BTNY=%f ",btnX,btnY);
btn.frame=CGRectMake(btnX, btnY+inverst, btnW, btnH);
}
}
//重写drawrect:方法
-(void)drawRect:(CGRect)rect
{
NSLog(@"断点顺序 4 号 ");
//获取上下文
CGContextRef ctx=UIGraphicsGetCurrentContext();
//在每次绘制前,清空上下文
CGContextClearRect(ctx, rect);
//填充画布颜色
[[self renderImageWithColor:[UIColor grayColor] inSize:CGSizeMake(KSCREEN_WIDTH, KSCREEN_HEIGHT)] drawInRect:CGRectMake(0, 0, KSCREEN_WIDTH, KSCREEN_HEIGHT)];//在坐标中画出图片
//绘图(线段)
for (int i=0; i<self.buttons.count; i++) {
UIButton *btn=self.buttons[i];
if (0==i) {
//设置起点(注意连接的是中点)
// CGContextMoveToPoint(ctx, btn.frame.origin.x, btn.frame.origin.y);
CGContextMoveToPoint(ctx, btn.center.x, btn.center.y);
}else
{
// CGContextAddLineToPoint(ctx, btn.frame.origin.x, btn.frame.origin.y);
CGContextAddLineToPoint(ctx, btn.center.x, btn.center.y);
}
}
//当所有按钮的中点都连接好之后,再连接手指当前的位置
//判断数组中是否有按钮,只有有按钮的时候才绘制
if (self.buttons.count !=0) {
CGContextAddLineToPoint(ctx, self.currentPoint.x, self.currentPoint.y);
}
//渲染
//设置线条的属性
CGContextSetLineWidth(ctx, 10);
CGContextSetLineJoin(ctx, kCGLineJoinRound);
CGContextSetLineCap(ctx, kCGLineCapRound);
CGContextSetRGBStrokeColor(ctx, 255/255.0, 0/255.0, 0/255.0, 1);
CGContextStrokePath(ctx);
}
//填充画布颜色
- (UIImage *)renderImageWithColor:(UIColor *)color inSize:(CGSize)size
{
CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
//5.监听手指的移动
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"断点 E 号 ");
CGPoint starPoint=[self getCurrentPoint:touches];
UIButton *btn=[self getCurrentBtnWithPoint:starPoint];
if (btn && btn.selected != YES) {
btn.selected=YES;
[self.buttons addObject:btn];
}
// [self setNeedsDisplay];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"断点 F 号 ");
CGPoint movePoint=[self getCurrentPoint:touches];
UIButton *btn=[self getCurrentBtnWithPoint:movePoint];
//存储按钮
//已经连过的按钮,不可再连
if (btn && btn.selected != YES) {
//设置按钮的选中状态
btn.selected=YES;
//把按钮添加到数组中
[self.buttons addObject:btn];
}
//记录当前点(不在按钮的范围内)
self.currentPoint=movePoint;
//通知view重新绘制
[self setNeedsDisplay];
}
//手指离开的时候清除线条
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"断点 G 号 ");
//取出用户输入的密码
//创建一个可变的字符串,用来保存用户密码
NSMutableString *result=[NSMutableString string];
for (UIButton *btn in self.buttons) {
[result appendFormat:@"%lu",btn.tag];
}
NSLog(@"用户输入的密码为:%@",result);
//通知代理,告知用户输入的密码
if ([self.delegate respondsToSelector:@selector(LockViewDidClick:andPwd:)]) {
[self.delegate LockViewDidClick:self andPwd:result];
}
//重置按钮的状态
// for (UIButton *btn in self.buttons) {
// btn.selected=NO;
//// [btn setSelected:NO];
// }
//调用该方法,它就会让数组中的每一个元素都调用setSelected:方法,并给每一个元素传递一个NO参数
[self.buttons makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];
//清空数组
[self.buttons removeAllObjects];
[self setNeedsDisplay];
//清空当前点
self.currentPoint=CGPointZero;
}
//对功能点进行封装
-(CGPoint)getCurrentPoint:(NSSet *)touches
{
NSLog(@"断点 H 号 ");
UITouch *touch=[touches anyObject];
CGPoint point=[touch locationInView:touch.view];
return point;
}
-(UIButton *)getCurrentBtnWithPoint:(CGPoint)point
{
NSLog(@"断点 J 号 ");
for (int i=0;i<_includButtons.count;i++) {
UIButton *btn =_includButtons[i];
if (CGRectContainsPoint(btn.frame, point)) {
return btn;
}
}
return Nil;
}
@end