zoukankan      html  css  js  c++  java
  • 在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 ", btn.tag); 
        } 

     
    @end

     
  • 相关阅读:
    EasyUI项目驱动学习
    给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数。 (即,使用函数rand5()来实现函数rand7())
    python手记(42)
    Succession
    第一节,学习cocos2d-x的前期准备
    DOM与JavaScript、jQuery之间的关系
    HTML5 精灵8方向移动+背景滚动+音效播放+鼠标事件响应
    Oracle多行记录合并自定义函数
    MSP430F5438 I2C学习笔记——AT24C02
    OPENCV 常用函数
  • 原文地址:https://www.cnblogs.com/fgyqbs/p/4044168.html
Copyright © 2011-2022 走看看