//创建初始化函数;通过touches事件,随手指位置移动,画出相应的密码解锁的连线。#import "OXLockView.h"
#import "OXLockViewController.h"#define kOXBaseCircleNumber     10000       // tag基数(请勿修改)
#define kCircleMargin           32.0        // 圆点离屏幕左边距
#define kCircleDiameter         68.0        // 圆点直径
#define kOXCircleAlpha          1.0         // 圆点透明度
#define kOXLineWidth            4.0         // 线条宽#define kOXLineColor [UIColor colorWithRed:77.0/255.0 green:76.0/255.0 blue:156.0/255.0 alpha:0.8]                  // 线条色蓝
#define kOXLineColorWrong [UIColor colorWithRed:201.0/255.0 green:9.0/255.0 blue:22.0/255.0 alpha:0.8]              // 线条色红@interface OXLockView () {NSMutableArray* _circleArray;NSMutableArray* _selectedCircleArray;NSMutableArray* _wrongCircleArray;CGPoint nowPoint;NSTimer* timer;BOOL isWrongColor;BOOL isDrawing;     // 标记是否正在绘图中
}@end@implementation OXLockView//No.1
//开始写代码,重写父类创建方法,使当前view在代码、storyboard或xib下都能正常创建- (instancetype)initWithFrame:(CGRect)frame
{self = [super initWithFrame:frame];if (self) {//添加子控件[self initCircles];}return self;
}//end_code- (void)initCircles {self.clipsToBounds = YES;_circleArray = [NSMutableArray array];_selectedCircleArray = [NSMutableArray array];for (int i = 0; i < 9; i++) {int x = kCircleMargin + (i%3) * (kCircleDiameter+(320-kCircleMargin*2- kCircleDiameter *3)/2);int y = kCircleMargin + (i/3) * (kCircleDiameter+(320-kCircleMargin*2- kCircleDiameter *3)/2);UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];button.frame = CGRectMake(x, y, kCircleDiameter, kCircleDiameter);[button setBackgroundColor:[UIColor clearColor]];[button setBackgroundImage:[UIImage imageNamed:@"circle_normal"] forState:UIControlStateNormal];[button setBackgroundImage:[UIImage imageNamed:@"circle_selected"] forState:UIControlStateSelected];button.userInteractionEnabled = NO;//禁止用户交互button.alpha = kOXCircleAlpha;button.tag = i + kOXBaseCircleNumber + 1; // tag从基数+1开始,[self addSubview:button];[_circleArray addObject:button];}self.backgroundColor = [UIColor clearColor];
}#pragma mark - Touches Event
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {isDrawing = NO;if (isWrongColor) {[self clearColorAndSelectedButton];}[self updatePositionWithTouches:touches];}- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {isDrawing = YES;CGPoint point = [[touches anyObject] locationInView:self];[self updatePositionWithTouches:touches];
}- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {[self endPosition];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {[self endPosition];
}#pragma mark - Draw Line
- (void)drawRect:(CGRect)rect {//No.2//开始写代码,使用CoreGraphics的方法画连接各点的线,根据上下文提示设置线条宽度、区分正误线颜色if (_selectedCircleArray.count) {UIBezierPath *path = [UIBezierPath bezierPath];for (int i = 0; i < _selectedCircleArray.count; i++) {//如果说按钮是第一个,让按钮的中心点是路径的起点UIButton *btn = _selectedCircleArray[i];if (i == 0) {[path moveToPoint:btn.center];} else {[path addLineToPoint:btn.center];}}//添加一根线到当前手指所在的点[path addLineToPoint:nowPoint];//设置线的状态[path setLineWidth:10];[[UIColor greenColor] set];[path setLineJoinStyle:kCGLineJoinRound];[path stroke];}//end_code
}#pragma mark - 处理
- (void)updatePositionWithTouches:(NSSet *)touches{//No.3//开始写代码,根据上下文补全改变当前手指位置时相应的处理//记录当前手指的位置UITouch *touch = [touches anyObject];CGPoint curP = [touch locationInView:self];nowPoint = curP;//判断当前点在不在按钮身上  如果按钮不为空 保存选中的按钮UIButton *btn = [self btnContainsPoint:curP];if (btn && btn.selected == NO) {btn.selected = YES;[_selectedCircleArray addObject:btn];}[self setNeedsDisplay];//end_code
}/
- (UIButton *)btnContainsPoint:(CGPoint)point
{for (UIButton *btn in self.subviews) {if (CGRectContainsPoint(btn.frame, point)) {return btn;}}return nil;
}- (void)endPosition {isDrawing = NO;UIButton *strbutton;NSString *string=@"";for (int i=0; i < _selectedCircleArray.count; i++) {strbutton = _selectedCircleArray[i];string= [string stringByAppendingFormat:@"%ld",(long)strbutton.tag-kOXBaseCircleNumber];}[self clearColorAndSelectedButton]; // 清除到初始样式if ([self.delegate respondsToSelector:@selector(lockString:)]) {if (string && string.length>0) {[self.delegate lockString:string];}}}/**清除至初始状态*/
- (void)clearColor {if (isWrongColor) {// 重置颜色isWrongColor = NO;for (UIButton* button in _circleArray) {[button setBackgroundImage:[UIImage imageNamed:@"circle_selected"] forState:UIControlStateSelected];}}
}- (void)clearSelectedButton {for (UIButton *thisButton in _circleArray) {[thisButton setSelected:NO];}[_selectedCircleArray removeAllObjects];[self setNeedsDisplay];
}- (void)clearColorAndSelectedButton {if (!isDrawing) {[self clearColor];[self clearSelectedButton];}}#pragma mark - Error Show
- (void)showErrorCircles:(NSString*)string {isWrongColor = YES;NSMutableArray* numbers = [[NSMutableArray alloc] initWithCapacity:string.length];for (int i = 0; i < string.length; i++) {NSRange range = NSMakeRange(i, 1);NSNumber* number = [NSNumber numberWithInt:[string substringWithRange:range].intValue-1]; // 数字是1开始的[numbers addObject:number];[_circleArray[number.intValue] setSelected:YES];[_selectedCircleArray addObject:_circleArray[number.intValue]];}for (UIButton* button in _circleArray) {if (button.selected) {[button setBackgroundImage:[UIImage imageNamed:@"circle_wrong"] forState:UIControlStateSelected];}}[self setNeedsDisplay];timer = [NSTimer scheduledTimerWithTimeInterval:1.0target:selfselector:@selector(clearColorAndSelectedButton)userInfo:nilrepeats:NO];}@end

iOS图案解锁(九宫格)相关推荐

  1. java实现九宫格解锁_轻松实现Android自定义九宫格图案解锁

    Android实现九宫格图案解锁,自带将图案转化成数字密码的功能,代码如下: LockPatternView.java package com.jackie.lockpattern; import a ...

  2. 九宫锁屏图案有多少种c语言编程,手机九宫格图案解锁问题,编程高手戳进来!...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 数学吧里看到的一个有趣问题,题目描述很简单: 求手机九宫格图案解锁一共有多少种答案.规则大家应该都知道,至少连四个点,最多连九个点,一条直线上的三个点只有 ...

  3. Android实现九宫格图案解锁

    Android实现九宫格图案解锁 前言:自定义了一个九宫格的VIew来绘制九宫格图案,实现了绘制图案解锁的功能. 效果图如下: 1. 第一步 自定义九宫格View. public class Lock ...

  4. 用C语言计算手机的九宫格图案解锁总共能绘出多少种图案

    之前在学校的一个社团招募大一新生时,给出了这个题目: 用程序编写完成九宫格图案解锁总共能绘出多少种图案 需要满足的要求有: 1.至少经过四个点: 2.不能重复经过同一个点: 3.路径上的中间点不能跳过 ...

  5. 9宫格解锁 android_android开发图案解锁学习记录一(九宫格的绘制)

    图案解锁的原理: 九宫格解锁故名思议就是要有九个宫格:然后宫格间进行连线. 首先我们要先绘制九个点(宫格),确定位置,然后绘制不同的图案. 图案分为不同的状态:正常的状态,按下时的状态和错误的状态 当 ...

  6. iOS篇—Demo3—图案解锁

    Demo3-图案解锁 一.搭建界面 1.设置背景颜色 self.view.backgroundColor = [UIColor grayColor]; 2.设置操作图片 UIImageView *op ...

  7. QML 实现九宫格图案解锁

    <QML基础教程>总目录 图案解锁 一.演示 二.简述 三.代码 一.演示 支持自定义行列数: 支持自定义颜色: 支持自定义吸附半径. 二.简述 1.使用GridView显示圆圈,方便自定 ...

  8. 快给你的app上锁吧(android图案解锁)

    序言:前两天因为项目的原因,去做了一下仿ios的数字解锁功能,然后写了那篇快给你的app上锁吧(android数字解锁),后来想到应用中常见的还有另外一种解锁就是绘制图案解锁,这两种解锁的布局看起来是 ...

  9. 长沙理工大学第十二届ACM大赛-重现赛C 安卓图案解锁 (模拟)

    链接:https://ac.nowcoder.com/acm/contest/1/C 来源:牛客网 安卓图案解锁 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

最新文章

  1. 机器学习数据预处理之缺失值:特征删除
  2. 谷歌X实验室的“无用”发明
  3. sess.run(tf.global_variables_initializer()) 做了什么?
  4. not null primary key什么意思_explain都不会用,你还好意思说精通Mysql查询优化?
  5. Java 联系Oracle 数据库
  6. pycharm安装javascript插件_IDEA必备插件系列-Rainbow
  7. oracle试图怎么使用,oracle 视图的介绍和使用
  8. mysql存储过程之异常处理篇
  9. PS 批处理切图去空白
  10. 手绘机器学习全流程,教你如何实现模型训练
  11. CCIE理论-第十二篇-IPV6-NDP协议
  12. wireshark 抓包使用教程
  13. 主动降噪开发之四——多通道算法实现
  14. 游戏小程序源码 一起来找茬
  15. PTA题目 抓老鼠啊~亏了还是赚了?
  16. 软件开发README文档书写模板
  17. Git基础(21):GitLab创建组、用户、项目
  18. Google开源JPEG压缩算法--Guetzli体验
  19. 华为云14天鸿蒙设备开发-Day1环境搭建
  20. AI产品经理面试问题积累

热门文章

  1. 【前端】js 视频笔记(DOM BOM)
  2. linux根据文件内容查找文件名,文件查找:find命令,文件名后缀
  3. 微信选择图片发朋友圈测试点【杭州多测师】【杭州多测师_王sir】
  4. 250g硬盘linux分区,三星250G硬盘分区后的问题
  5. 【Beta阶段】Scrum meeting 3
  6. Mask R-CNN 原理解析
  7. trac mysql_Trac的安装和简单使用
  8. 巴菲特50年投资之道
  9. 全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么
  10. 建行找不到服务器或DNS错误,Win7用浏览器上网总是弹出提示是否停止运行此脚本窗口...