在一些涉及个人隐私的场景下,尤其是当移动设备包含太多私密信息时,为用户的安全考虑是有必要的。

桌面版的QQ在很多年前就考虑到用户离开电脑后隐私泄露的危险,提供了“离开电脑自动锁定”或者“闲置锁定”等类似功能,具体我也忘了。

而在iPhone版的QQ上,也提供了手势锁的功能。如下图:

我在上一篇博文中简单提到如何根据手指移动画线条,而这里是进一步的版本,仍然只是粗糙原型:

具体的代码实现如下:

[cpp] view plaincopy
  1. //
  2. //  ViewController.m
  3. //  GestureLock
  4. //
  5. //  Created by Jason Lee on 12-9-26.
  6. //  Copyright (c) 2012年 Jason Lee. All rights reserved.
  7. //
  8. #import "ViewController.h"
  9. #define LOCK_POINT_TAG      1000
  10. @interface ViewController ()
  11. @property (nonatomic, strong) UIImageView *imageView;
  12. @property (nonatomic, assign) CGPoint lineStartPoint;
  13. @property (nonatomic, assign) CGPoint lineEndPoint;
  14. @property (nonatomic, strong) NSMutableArray *buttonArray;
  15. @property (nonatomic, strong) NSMutableArray *selectedButtons;
  16. @property (nonatomic, assign) BOOL drawFlag;
  17. @property (nonatomic, strong) UIImage *pointImage;
  18. @property (nonatomic, strong) UIImage *selectedImage;
  19. @end
  20. @implementation ViewController
  21. - (void)dealloc
  22. {
  23. [super dealloc];
  24. //
  25. [_imageView release];
  26. [_buttonArray release];
  27. [_selectedButtons release];
  28. [_pointImage release];
  29. [_selectedImage release];
  30. }
  31. - (void)viewDidLoad
  32. {
  33. [super viewDidLoad];
  34. // Do any additional setup after loading the view, typically from a nib.
  35. _imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
  36. [self.view addSubview:self.imageView];
  37. self.imageView.backgroundColor = [UIColor whiteColor];
  38. [self createLockPoints];
  39. }
  40. - (void)didReceiveMemoryWarning
  41. {
  42. [super didReceiveMemoryWarning];
  43. // Dispose of any resources that can be recreated.
  44. }
  45. #pragma mark - Trace Touch Point
  46. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  47. {
  48. UITouch *touch = [touches anyObject];
  49. if (touch) {
  50. for (UIButton *btn in self.buttonArray) {
  51. CGPoint touchPoint = [touch locationInView:btn];
  52. if ([btn pointInside:touchPoint withEvent:nil]) {
  53. self.lineStartPoint = btn.center;
  54. self.drawFlag = YES;
  55. if (!self.selectedButtons) {
  56. self.selectedButtons = [NSMutableArray arrayWithCapacity:9];
  57. }
  58. [self.selectedButtons addObject:btn];
  59. [btn setImage:self.selectedImage forState:UIControlStateNormal];
  60. }
  61. }
  62. }
  63. }
  64. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
  65. {
  66. UITouch *touch = [touches anyObject];
  67. if (touch && self.drawFlag) {
  68. self.lineEndPoint = [touch locationInView:self.imageView];
  69. for (UIButton *btn in self.buttonArray) {
  70. CGPoint touchPoint = [touch locationInView:btn];
  71. if ([btn pointInside:touchPoint withEvent:nil]) {
  72. BOOL btnContained = NO;
  73. for (UIButton *selectedBtn in self.selectedButtons) {
  74. if (btn == selectedBtn) {
  75. btnContained = YES;
  76. break;
  77. }
  78. }
  79. if (!btnContained) {
  80. [self.selectedButtons addObject:btn];
  81. [btn setImage:self.selectedImage forState:UIControlStateNormal];
  82. }
  83. }
  84. }
  85. self.imageView.image = [self drawUnlockLine];
  86. }
  87. }
  88. - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
  89. {
  90. [self outputSelectedButtons];
  91. self.drawFlag = NO;
  92. self.imageView.image = nil;
  93. self.selectedButtons = nil;
  94. }
  95. #pragma mark - Create Lock Points
  96. - (void)createLockPoints
  97. {
  98. self.pointImage = [UIImage imageNamed:@"blue_circle"];
  99. self.selectedImage = [UIImage imageNamed:@"yellow_circle"];
  100. float marginTop = 100;
  101. float marginLeft = 45;
  102. float y;
  103. for (int i = 0; i < 3; ++i) {
  104. y = i * 100;
  105. float x;
  106. for (int j = 0; j < 3; ++j) {
  107. x = j * 100;
  108. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  109. [btn setImage:self.pointImage forState:UIControlStateNormal];
  110. [btn setImage:self.selectedImage forState:UIControlStateHighlighted];
  111. btn.frame = (CGRect){x+marginLeft, y+marginTop, self.pointImage.size};
  112. [self.imageView addSubview:btn];
  113. btn.userInteractionEnabled = NO;
  114. btn.tag = LOCK_POINT_TAG + i * 3 + j;
  115. if (!self.buttonArray) {
  116. self.buttonArray = [NSMutableArray arrayWithCapacity:9];
  117. }
  118. [self.buttonArray addObject:btn];
  119. }
  120. }
  121. }
  122. #pragma mark - Draw Line
  123. - (UIImage *)drawUnlockLine
  124. {
  125. UIImage *image = nil;
  126. UIColor *color = [UIColor yellowColor];
  127. CGFloat width = 5.0f;
  128. CGSize imageContextSize = self.imageView.frame.size;
  129. UIGraphicsBeginImageContext(imageContextSize);
  130. CGContextRef context = UIGraphicsGetCurrentContext();
  131. CGContextSetLineWidth(context, width);
  132. CGContextSetStrokeColorWithColor(context, [color CGColor]);
  133. CGContextMoveToPoint(context, self.lineStartPoint.x, self.lineStartPoint.y);
  134. for (UIButton *selectedBtn in self.selectedButtons) {
  135. CGPoint btnCenter = selectedBtn.center;
  136. CGContextAddLineToPoint(context, btnCenter.x, btnCenter.y);
  137. CGContextMoveToPoint(context, btnCenter.x, btnCenter.y);
  138. }
  139. CGContextAddLineToPoint(context, self.lineEndPoint.x, self.lineEndPoint.y);
  140. CGContextStrokePath(context);
  141. image = UIGraphicsGetImageFromCurrentImageContext();
  142. UIGraphicsEndImageContext();
  143. return image;
  144. }
  145. #pragma mark -
  146. - (void)outputSelectedButtons
  147. {
  148. for (UIButton *btn in self.selectedButtons) {
  149. [btn setImage:self.pointImage forState:UIControlStateNormal];
  150. NSLog(@"Selected-button's tag : %d\n", btn.tag);
  151. }
  152. }
  153. @end

Jason Lee @ Hangzhou

微博:@思禽饮霜

原文地址:http://blog.csdn.net/jasonblog/article/details/8024674

在iOS上增加手势锁屏、解锁功能相关推荐

  1. Android仿苹果iphone数字锁屏解锁功能

    跟着我一起按步骤来做,保证你一学就会. 步骤如下: 一.先自定义一个键盘布局文件: 在项目res/xml目录下新建一个xml文件,比如number_only.xml [html] view plain ...

  2. 防手机锁屏解锁自定义View

    文章目录 一.简介 二.ObjectAnimator与Scroller实现比较 三. Scroller实现核心 1.锁屏解锁主要有两个关键点 2.触摸手机滑动带动页面进行滑动 3.手指离开屏幕判断是否 ...

  3. android解锁界面分析,Android 7.0 锁屏解锁之向上滑动显示解锁界面分析

    Android 7.0 锁屏解锁之向上滑动显示解锁界面分析 by jing.chen 锁屏的解锁操作是在锁屏界面向上滑动实现的,通过向上滑动调出解锁界面(如图案.PIN.密码解锁界面),在解锁界面输入 ...

  4. [源码]Android安卓应用手势锁图案解锁的实现

    交互细节 用户首先使用账号/密码进行登录. 登录成功后,判断是否是第一次登录使用,如果是第一次则显示创建手势密码的界面,要求用户创建手势锁. 创建的过程中要求用户连接至少四个点,并且绘制两次以确认绘制 ...

  5. MX4 Pro上实现一键锁屏

    2019独角兽企业重金招聘Python工程师标准>>> 前因 前两天入手了一台MX4 Pro.自己拿到真机之后,着实高兴了一阵,立刻把玩了一会.虽然MX4 Pro的小圆圈没了,但是为 ...

  6. [html] 实现一个页面锁屏的功能

    [html] 实现一个页面锁屏的功能 <!DOCTYPE html> <html> <head> <title>Ctrl+l监控锁屏</title ...

  7. 慎重升级!iOS 13可绕过锁屏密码查看通讯录、照片、短信

    自从,上个星期 iPhone 11 发布之后,我已经好几天没睡好觉了.转发了好多抽奖微博,第六感告诉我,这次我怎么也能欧气一回. 反正不欧气也关系,毕竟只要一个肾,我打算自己买一个. 听说我要买手机的 ...

  8. iOS 音乐播放器之锁屏效果+歌词解析

    概述 功能描述:锁屏歌曲信息.控制台远程控制音乐播放:暂停/播放.上一首/下一首.快进/快退.列表菜单弹框和拖拽控制台的进度条调节进度(结合了QQ音乐和网易云音乐在锁屏状态下的效果).歌词解析并随音乐 ...

  9. ios开发之MPNowPlayingInfoCenter 锁屏显示正在播放的音乐

    今天在床上玩唱吧,听着歌锁屏了,当点亮屏幕的时候,锁屏页面出现了我正在听得歌曲 壁纸也换成了唱吧里面的歌手图片.做ios好几年了,从没有做过这个需求 于是好奇就翻看ios的API文档找到了这个类. 如 ...

最新文章

  1. struts.xml配置文件中result的语法
  2. 安装pyspider后运行pyspider all后遇到的问题
  3. 微信图文内容自动同步到腾讯内容开放平台的操作步骤
  4. [AH2017/HNOI2017]礼物
  5. mybatis一对一联表查询的两种常见方式
  6. JS模块化编程require.js简介
  7. 对比两个字符串相等_字符串匹配问题
  8. 译:C#面向对象的基本概念 (Basic C# OOP Concept) 第二部分(封装,抽象,继承)...
  9. linux oracle11g客户端安装
  10. 极光推送 java 绑定别名_极光推送-别名篇
  11. android 恢复出厂设置代码流程(Good!)
  12. C++模板Trait
  13. PDF编辑器(PDF Editor)中文版
  14. 回归分析中f多少合适_问下,spss回归分析得出的R方值、F值、t值各有何含义,数值大小有何含义?...
  15. 模块参考资料-硬件资料-Air720UG/UH
  16. 用python画钢铁侠_秒变钢铁侠,这个暑假,用 Python 让自己成为超级英雄!
  17. ESLint 与 Prettier使用
  18. 常用路由协议的分析及比较/RIP/IGRP/OSPF/BGP
  19. 12-用户及权限管理
  20. weblogic portal 11g 集群

热门文章

  1. 汉字风格迁移篇---SKFont:具有条件深度对抗网络的骨架驱动韩文字体生成器
  2. 【51】使用51单片机和数码管生成10以内加法及两组数据判断大小
  3. 局域网限速软件_百度网盘竟良心发现,下载不再限速?
  4. 浏览器I/O读写测试:Chrome vs. 360急速浏览器
  5. 项目中集成SuperPlayer 超级播放器和腾讯云IM TUIKit
  6. Sa-Token简单登录认证
  7. socket接口测试工具_接口测试是什么?如何做好接口测试?
  8. centos异常,报错:Unmount and run xfs_repair
  9. 人工智能之父、Lisp语言发明者约翰麦卡锡去世,又一巨人去了
  10. 计算机打印机显示错误代码,添加打印机失败 提示错误代码0x00000057的解决办法...