看到一些APP应用里的手势解锁挺有意思也挺好奇的,所以自己从网上dang了些素材实现了下这个功能。
在这里先记录下一些知识点:
1、绘制九宫格样式的按钮组
//创建九宫格按钮组
func createButton()
{
var secret = 0
for row in0...2
{
for col in 0...2
{
//设置九个按钮的位置,图片
let buttonDistance = 100//间距
let firstBtnPointX = 0//第一个按钮的X
let firstBtnPointY = 0//第一个按钮的Y
let tempX:(CGFloat) =CGFloat(firstBtnPointX + col*buttonDistance)
let tempY:(CGFloat) =CGFloat(firstBtnPointY + row*buttonDistance)
//声明按钮
let btn:(UIButton) =UIButton(type:UIButtonType.Custom)
btn.userInteractionEnabled = false //关闭用户交互
btn.frame = CGRectMake(tempX, tempY, 80, 80)//按钮位置和大小设置
btn.setImage(UIImage(named:"gesture_node_normal"), forState:UIControlState.Normal)//默认
btn.setImage(UIImage(named:"gesture_node_highlighted"), forState:UIControlState.Selected)//选中
btn.tag = secret++ //用来当作密码0-8
self.addSubview(btn)
}
}
}
2、根据触摸获取的坐标点获取按钮
首先根据事件传入的Set<UITouch>获取当前试图中触摸点的位置,在根据触摸点的位置获取按钮。
//获取位置传入当前触摸的视图
let pos:(CGPoint) = (touch?.locationInView(touch!.view))!
//遍历当前View的子视图获取按钮
for btninself.subviews
{
if CGRectContainsPoint(btn.frame, point)
{
return btn as? UIButton
}
}
3、根据手势滑动经过的按钮坐标绘制线
1)需要先定义一个存储纪动经过按钮的数据
2)绘制线条需要监听3个事件分别是:触摸开始、触摸移动、触摸结束将经过的按钮保存到数组中。每次事件结束需要调用self.setNeedsDisplay()来绘制视图
3)使用UIBezierPath对象来绘制连接线:
override func drawRect(rect:CGRect) {
//没有按钮
if self.btnSelectArr.count ==0
{
return //直接返回
}
//有按钮,则绘制
let path:(UIBezierPath) =UIBezierPath()//创建路径
for index in 0...self.btnSelectArr.count -1
{
let btn:(UIButton) =self.btnSelectArr.objectAtIndex(index)as!UIButton
//第一个按钮(每次会在的起点)
if index == 0
{
path.moveToPoint(btn.center)//从第一个按钮开始移动
}
else
{
path.addLineToPoint(btn.center)//连接
}
}
path.lineWidth = 8 //线宽
UIColor.blueColor().set()//颜色
path.stroke()//绘制
}
源码:http://yunpan.cn/c3VdCCzTgBV4E (提取码:3563)