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

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

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

桌面版的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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。