在iOS上增加手势锁屏、解锁功能
在一些涉及个人隐私的场景下,尤其是当移动设备包含太多私密信息时,为用户的安全考虑是有必要的。
桌面版的QQ在很多年前就考虑到用户离开电脑后隐私泄露的危险,提供了“离开电脑自动锁定”或者“闲置锁定”等类似功能,具体我也忘了。
而在iPhone版的QQ上,也提供了手势锁的功能。如下图:
我在上一篇博文中简单提到如何根据手指移动画线条,而这里是进一步的版本,仍然只是粗糙原型:
具体的代码实现如下:
- //
- // ViewController.m
- // GestureLock
- //
- // Created by Jason Lee on 12-9-26.
- // Copyright (c) 2012年 Jason Lee. All rights reserved.
- //
- #import "ViewController.h"
- #define LOCK_POINT_TAG 1000
- @interface ViewController ()
- @property (nonatomic, strong) UIImageView *imageView;
- @property (nonatomic, assign) CGPoint lineStartPoint;
- @property (nonatomic, assign) CGPoint lineEndPoint;
- @property (nonatomic, strong) NSMutableArray *buttonArray;
- @property (nonatomic, strong) NSMutableArray *selectedButtons;
- @property (nonatomic, assign) BOOL drawFlag;
- @property (nonatomic, strong) UIImage *pointImage;
- @property (nonatomic, strong) UIImage *selectedImage;
- @end
- @implementation ViewController
- - (void)dealloc
- {
- [super dealloc];
- //
- [_imageView release];
- [_buttonArray release];
- [_selectedButtons release];
- [_pointImage release];
- [_selectedImage release];
- }
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- _imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
- [self.view addSubview:self.imageView];
- self.imageView.backgroundColor = [UIColor whiteColor];
- [self createLockPoints];
- }
- - (void)didReceiveMemoryWarning
- {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- #pragma mark - Trace Touch Point
- - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- {
- UITouch *touch = [touches anyObject];
- if (touch) {
- for (UIButton *btn in self.buttonArray) {
- CGPoint touchPoint = [touch locationInView:btn];
- if ([btn pointInside:touchPoint withEvent:nil]) {
- self.lineStartPoint = btn.center;
- self.drawFlag = YES;
- if (!self.selectedButtons) {
- self.selectedButtons = [NSMutableArray arrayWithCapacity:9];
- }
- [self.selectedButtons addObject:btn];
- [btn setImage:self.selectedImage forState:UIControlStateNormal];
- }
- }
- }
- }
- - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- {
- UITouch *touch = [touches anyObject];
- if (touch && self.drawFlag) {
- self.lineEndPoint = [touch locationInView:self.imageView];
- for (UIButton *btn in self.buttonArray) {
- CGPoint touchPoint = [touch locationInView:btn];
- if ([btn pointInside:touchPoint withEvent:nil]) {
- BOOL btnContained = NO;
- for (UIButton *selectedBtn in self.selectedButtons) {
- if (btn == selectedBtn) {
- btnContained = YES;
- break;
- }
- }
- if (!btnContained) {
- [self.selectedButtons addObject:btn];
- [btn setImage:self.selectedImage forState:UIControlStateNormal];
- }
- }
- }
- self.imageView.image = [self drawUnlockLine];
- }
- }
- - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- {
- [self outputSelectedButtons];
- self.drawFlag = NO;
- self.imageView.image = nil;
- self.selectedButtons = nil;
- }
- #pragma mark - Create Lock Points
- - (void)createLockPoints
- {
- self.pointImage = [UIImage imageNamed:@"blue_circle"];
- self.selectedImage = [UIImage imageNamed:@"yellow_circle"];
- float marginTop = 100;
- float marginLeft = 45;
- float y;
- for (int i = 0; i < 3; ++i) {
- y = i * 100;
- float x;
- for (int j = 0; j < 3; ++j) {
- x = j * 100;
- UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
- [btn setImage:self.pointImage forState:UIControlStateNormal];
- [btn setImage:self.selectedImage forState:UIControlStateHighlighted];
- btn.frame = (CGRect){x+marginLeft, y+marginTop, self.pointImage.size};
- [self.imageView addSubview:btn];
- btn.userInteractionEnabled = NO;
- btn.tag = LOCK_POINT_TAG + i * 3 + j;
- if (!self.buttonArray) {
- self.buttonArray = [NSMutableArray arrayWithCapacity:9];
- }
- [self.buttonArray addObject:btn];
- }
- }
- }
- #pragma mark - Draw Line
- - (UIImage *)drawUnlockLine
- {
- UIImage *image = nil;
- UIColor *color = [UIColor yellowColor];
- CGFloat width = 5.0f;
- CGSize imageContextSize = self.imageView.frame.size;
- UIGraphicsBeginImageContext(imageContextSize);
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSetLineWidth(context, width);
- CGContextSetStrokeColorWithColor(context, [color CGColor]);
- CGContextMoveToPoint(context, self.lineStartPoint.x, self.lineStartPoint.y);
- for (UIButton *selectedBtn in self.selectedButtons) {
- CGPoint btnCenter = selectedBtn.center;
- CGContextAddLineToPoint(context, btnCenter.x, btnCenter.y);
- CGContextMoveToPoint(context, btnCenter.x, btnCenter.y);
- }
- CGContextAddLineToPoint(context, self.lineEndPoint.x, self.lineEndPoint.y);
- CGContextStrokePath(context);
- image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return image;
- }
- #pragma mark -
- - (void)outputSelectedButtons
- {
- for (UIButton *btn in self.selectedButtons) {
- [btn setImage:self.pointImage forState:UIControlStateNormal];
- NSLog(@"Selected-button's tag : %d\n", btn.tag);
- }
- }
- @end
Jason Lee @ Hangzhou
微博:@思禽饮霜
原文地址:http://blog.csdn.net/jasonblog/article/details/8024674
在iOS上增加手势锁屏、解锁功能相关推荐
- Android仿苹果iphone数字锁屏解锁功能
跟着我一起按步骤来做,保证你一学就会. 步骤如下: 一.先自定义一个键盘布局文件: 在项目res/xml目录下新建一个xml文件,比如number_only.xml [html] view plain ...
- 防手机锁屏解锁自定义View
文章目录 一.简介 二.ObjectAnimator与Scroller实现比较 三. Scroller实现核心 1.锁屏解锁主要有两个关键点 2.触摸手机滑动带动页面进行滑动 3.手指离开屏幕判断是否 ...
- android解锁界面分析,Android 7.0 锁屏解锁之向上滑动显示解锁界面分析
Android 7.0 锁屏解锁之向上滑动显示解锁界面分析 by jing.chen 锁屏的解锁操作是在锁屏界面向上滑动实现的,通过向上滑动调出解锁界面(如图案.PIN.密码解锁界面),在解锁界面输入 ...
- [源码]Android安卓应用手势锁图案解锁的实现
交互细节 用户首先使用账号/密码进行登录. 登录成功后,判断是否是第一次登录使用,如果是第一次则显示创建手势密码的界面,要求用户创建手势锁. 创建的过程中要求用户连接至少四个点,并且绘制两次以确认绘制 ...
- MX4 Pro上实现一键锁屏
2019独角兽企业重金招聘Python工程师标准>>> 前因 前两天入手了一台MX4 Pro.自己拿到真机之后,着实高兴了一阵,立刻把玩了一会.虽然MX4 Pro的小圆圈没了,但是为 ...
- [html] 实现一个页面锁屏的功能
[html] 实现一个页面锁屏的功能 <!DOCTYPE html> <html> <head> <title>Ctrl+l监控锁屏</title ...
- 慎重升级!iOS 13可绕过锁屏密码查看通讯录、照片、短信
自从,上个星期 iPhone 11 发布之后,我已经好几天没睡好觉了.转发了好多抽奖微博,第六感告诉我,这次我怎么也能欧气一回. 反正不欧气也关系,毕竟只要一个肾,我打算自己买一个. 听说我要买手机的 ...
- iOS 音乐播放器之锁屏效果+歌词解析
概述 功能描述:锁屏歌曲信息.控制台远程控制音乐播放:暂停/播放.上一首/下一首.快进/快退.列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果).歌词解析并随音乐 ...
- ios开发之MPNowPlayingInfoCenter 锁屏显示正在播放的音乐
今天在床上玩唱吧,听着歌锁屏了,当点亮屏幕的时候,锁屏页面出现了我正在听得歌曲 壁纸也换成了唱吧里面的歌手图片.做ios好几年了,从没有做过这个需求 于是好奇就翻看ios的API文档找到了这个类. 如 ...
最新文章
- struts.xml配置文件中result的语法
- 安装pyspider后运行pyspider all后遇到的问题
- 微信图文内容自动同步到腾讯内容开放平台的操作步骤
- [AH2017/HNOI2017]礼物
- mybatis一对一联表查询的两种常见方式
- JS模块化编程require.js简介
- 对比两个字符串相等_字符串匹配问题
- 译:C#面向对象的基本概念 (Basic C# OOP Concept) 第二部分(封装,抽象,继承)...
- linux oracle11g客户端安装
- 极光推送 java 绑定别名_极光推送-别名篇
- android 恢复出厂设置代码流程(Good!)
- C++模板Trait
- PDF编辑器(PDF Editor)中文版
- 回归分析中f多少合适_问下,spss回归分析得出的R方值、F值、t值各有何含义,数值大小有何含义?...
- 模块参考资料-硬件资料-Air720UG/UH
- 用python画钢铁侠_秒变钢铁侠,这个暑假,用 Python 让自己成为超级英雄!
- ESLint 与 Prettier使用
- 常用路由协议的分析及比较/RIP/IGRP/OSPF/BGP
- 12-用户及权限管理
- weblogic portal 11g 集群
热门文章
- 汉字风格迁移篇---SKFont:具有条件深度对抗网络的骨架驱动韩文字体生成器
- 【51】使用51单片机和数码管生成10以内加法及两组数据判断大小
- 局域网限速软件_百度网盘竟良心发现,下载不再限速?
- 浏览器I/O读写测试:Chrome vs. 360急速浏览器
- 项目中集成SuperPlayer 超级播放器和腾讯云IM TUIKit
- Sa-Token简单登录认证
- socket接口测试工具_接口测试是什么?如何做好接口测试?
- centos异常,报错:Unmount and run xfs_repair
- 人工智能之父、Lisp语言发明者约翰麦卡锡去世,又一巨人去了
- 计算机打印机显示错误代码,添加打印机失败 提示错误代码0x00000057的解决办法...