在iOS上增加手势锁屏、解锁功能

本文介绍了一种基于手势的iPhone版QQ解锁功能,通过用户在屏幕上绘制特定的线条来验证身份,从而在保护隐私的同时提高安全性。详细阐述了实现过程,包括代码片段和关键组件的使用。

转载自:http://www.2cto.com/kf/201209/158186.html

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

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

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

 


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

 

 

具体的代码实现如下:


[cpp] 
// 
//  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



内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值