iOS图案解锁(九宫格)
//创建初始化函数;通过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图案解锁(九宫格)相关推荐
- java实现九宫格解锁_轻松实现Android自定义九宫格图案解锁
Android实现九宫格图案解锁,自带将图案转化成数字密码的功能,代码如下: LockPatternView.java package com.jackie.lockpattern; import a ...
- 九宫锁屏图案有多少种c语言编程,手机九宫格图案解锁问题,编程高手戳进来!...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 数学吧里看到的一个有趣问题,题目描述很简单: 求手机九宫格图案解锁一共有多少种答案.规则大家应该都知道,至少连四个点,最多连九个点,一条直线上的三个点只有 ...
- Android实现九宫格图案解锁
Android实现九宫格图案解锁 前言:自定义了一个九宫格的VIew来绘制九宫格图案,实现了绘制图案解锁的功能. 效果图如下: 1. 第一步 自定义九宫格View. public class Lock ...
- 用C语言计算手机的九宫格图案解锁总共能绘出多少种图案
之前在学校的一个社团招募大一新生时,给出了这个题目: 用程序编写完成九宫格图案解锁总共能绘出多少种图案 需要满足的要求有: 1.至少经过四个点: 2.不能重复经过同一个点: 3.路径上的中间点不能跳过 ...
- 9宫格解锁 android_android开发图案解锁学习记录一(九宫格的绘制)
图案解锁的原理: 九宫格解锁故名思议就是要有九个宫格:然后宫格间进行连线. 首先我们要先绘制九个点(宫格),确定位置,然后绘制不同的图案. 图案分为不同的状态:正常的状态,按下时的状态和错误的状态 当 ...
- iOS篇—Demo3—图案解锁
Demo3-图案解锁 一.搭建界面 1.设置背景颜色 self.view.backgroundColor = [UIColor grayColor]; 2.设置操作图片 UIImageView *op ...
- QML 实现九宫格图案解锁
<QML基础教程>总目录 图案解锁 一.演示 二.简述 三.代码 一.演示 支持自定义行列数: 支持自定义颜色: 支持自定义吸附半径. 二.简述 1.使用GridView显示圆圈,方便自定 ...
- 快给你的app上锁吧(android图案解锁)
序言:前两天因为项目的原因,去做了一下仿ios的数字解锁功能,然后写了那篇快给你的app上锁吧(android数字解锁),后来想到应用中常见的还有另外一种解锁就是绘制图案解锁,这两种解锁的布局看起来是 ...
- 长沙理工大学第十二届ACM大赛-重现赛C 安卓图案解锁 (模拟)
链接:https://ac.nowcoder.com/acm/contest/1/C 来源:牛客网 安卓图案解锁 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...
最新文章
- 机器学习数据预处理之缺失值:特征删除
- 谷歌X实验室的“无用”发明
- sess.run(tf.global_variables_initializer()) 做了什么?
- not null primary key什么意思_explain都不会用,你还好意思说精通Mysql查询优化?
- Java 联系Oracle 数据库
- pycharm安装javascript插件_IDEA必备插件系列-Rainbow
- oracle试图怎么使用,oracle 视图的介绍和使用
- mysql存储过程之异常处理篇
- PS 批处理切图去空白
- 手绘机器学习全流程,教你如何实现模型训练
- CCIE理论-第十二篇-IPV6-NDP协议
- wireshark 抓包使用教程
- 主动降噪开发之四——多通道算法实现
- 游戏小程序源码 一起来找茬
- PTA题目 抓老鼠啊~亏了还是赚了?
- 软件开发README文档书写模板
- Git基础(21):GitLab创建组、用户、项目
- Google开源JPEG压缩算法--Guetzli体验
- 华为云14天鸿蒙设备开发-Day1环境搭建
- AI产品经理面试问题积累
热门文章
- 【前端】js 视频笔记(DOM BOM)
- linux根据文件内容查找文件名,文件查找:find命令,文件名后缀
- 微信选择图片发朋友圈测试点【杭州多测师】【杭州多测师_王sir】
- 250g硬盘linux分区,三星250G硬盘分区后的问题
- 【Beta阶段】Scrum meeting 3
- Mask R-CNN 原理解析
- trac mysql_Trac的安装和简单使用
- 巴菲特50年投资之道
- 全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么
- 建行找不到服务器或DNS错误,Win7用浏览器上网总是弹出提示是否停止运行此脚本窗口...