天天看點

在iOS上增加手勢鎖屏、解鎖功能

在一些涉及個人隐私的場景下,尤其是當移動裝置包含太多私密資訊時,為使用者的安全考慮是有必要的。

桌面版的QQ在很多年前就考慮到使用者離開電腦後隐私洩露的危險,提供了“離開電腦自動鎖定”或者“閑置鎖定”等類似功能,具體我也忘了。

而在iPhone版的QQ上,也提供了手勢鎖的功能。如下圖:

在iOS上增加手勢鎖屏、解鎖功能

我在上一篇博文中簡單提到如何根據手指移動畫線條,而這裡是進一步的版本,仍然隻是粗糙原型:

在iOS上增加手勢鎖屏、解鎖功能

具體的代碼實作如下:

//
//  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