zoukankan      html  css  js  c++  java
  • 支付宝登陆界面(手势解锁的实现)

     //1.下面是实现的步骤,基本上下面的注释应该都写明白了,多谢大牛们指点,如果需要素材和源工程文件,可以索要,谢谢支持 ☺

     //2.在最下面附有效果图

    #import "ViewController.h"

    #import "FFFGestureView.h"

    @interface ViewController ()

    @property (weak, nonatomic) IBOutlet UIImageView *smallView;

    @property (weak, nonatomic) IBOutlet FFFGestureView *gestureView;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Home_refresh_bg"]];

        self.gestureView.myblock = ^(UIImage *image,NSString *pass){

            NSString *turePass = @"012";

            if([pass isEqualToString:turePass]){

                self.smallView.image = nil;

                return YES;

            }else{

                self.smallView.image = image;

                return NO;

            }

        };

    }

    ***************************************************************************

    #import <UIKit/UIKit.h>

    @interface FFFGestureView : UIView

    @property (nonatomic,copy) BOOL(^myblock)(UIImage *,NSString *);

    @end

    ***************************************************************************

    #import "FFFGestureView.h"

    #import "SVProgressHUD.h"

    #define SUMCOUNT 9

    @interface FFFGestureView ()

    //定义可变数组加载需要的button

    @property (nonatomic,strong) NSArray *buttons;

    //设置数组接收画的线

    @property (nonatomic,strong) NSMutableArray *lineButton;

    //定义一个点,保存手指当前的位置

    @property(nonatomic,assign) CGPoint currentPoint;

    @end

    @implementation FFFGestureView

    -(NSMutableArray *)lineButton{

        if(_lineButton==nil){

            _lineButton = [NSMutableArray array];

        }

        return _lineButton;

    }

    //懒加载button

    -(NSArray *)buttons{

        if(_buttons==nil){

            NSMutableArray *arrayM = [NSMutableArray array];

            for(int i=0;i<SUMCOUNT;i++){

                

                UIButton *button = [[UIButton alloc] init];

                button.tag = i;

    //            button.backgroundColor = [UIColor redColor];

                [button setUserInteractionEnabled:NO];

                

                [button setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];

                [button setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateHighlighted];

                [button setBackgroundImage:[UIImage imageNamed:@"gesture_node_error"] forState:UIControlStateSelected];

                

                [self addSubview:button];

                [arrayM addObject:button];

            }

            _buttons = [arrayM copy];

        }

        return _buttons;

    }

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    //    获取touch对象

        UITouch *touch = [touches anyObject];

    //    获取点击的点

        CGPoint point = [touch locationInView:touch.view];

        

    //    遍历所有的按钮

        for(int i=0;i<self.buttons.count;i++){

        

            UIButton *button = self.buttons[i];

    //        按钮的frame是否包含了点击的点

            if(CGRectContainsPoint(button.frame, point)){

    //        开始高亮状态

                button.highlighted = YES;

                

    //            判断这个按钮是不是已经添加到了数组当中,如果没有在添加

                if(![self.lineButton containsObject:button]){

                

                    [self.lineButton addObject:button];

                }

            }

        }

    }

    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

        //    获取touch对象

        UITouch *touch = [touches anyObject];

        //    获取点击的点

        CGPoint point = [touch locationInView:touch.view];

        

        //    获取移动的时候手指位置

        self.currentPoint = point;

        //    遍历所有的按钮

        for(int i=0;i<self.buttons.count;i++){

            

            UIButton *button = self.buttons[i];

            //        按钮的frame是否包含了点击的点

            if(CGRectContainsPoint(button.frame, point)){

                //        开始高亮状态

                button.highlighted = YES;

    //            判断这个按钮是不是已经添加到了数组当中,如果没有在添加

                if(![self.lineButton containsObject:button]){

                    

                    [self.lineButton addObject:button];

                }

            }

        }

        [self setNeedsDisplay];

    }

    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

    //    解决错误的时候,最后手指的位置不连接

        self.currentPoint = [[self.lineButton lastObject] center];

        [self setNeedsDisplay];

        

        for (int i=0; i<self.lineButton.count; i++) {

            UIButton *button = self.lineButton[i];

            button.selected = YES;

            button.highlighted = NO;

        }

    //    在恢复之前不能进行连线

        [self setUserInteractionEnabled:NO];

        

        NSString *passWord = @"";

        for (int i=0; i<self.lineButton.count; i++) {

            //        拼接按钮的tag

            passWord = [passWord stringByAppendingString:[NSString stringWithFormat:@"%ld",[self.lineButton[i] tag]]];

        }

        

    //    输出当前VIew作为image

        UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0);

    //    获取上下文

        CGContextRef ctx = UIGraphicsGetCurrentContext();

    //    渲染

        [self.layer renderInContext:ctx];

    //    通过上下文获取图片

        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    //    关闭上下文

        UIGraphicsEndImageContext();

        

        if(self.myblock){

            if(self.myblock(image,passWord)){

                [SVProgressHUD showSuccessWithStatus:@"密码正确"];

            }else{

                [SVProgressHUD showErrorWithStatus:@"密码错误"];

            }

        }

    //    显示错误的样式 1秒钟

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    //        恢复之后再把用户交互打开

            [self setUserInteractionEnabled:YES];

            [self clearScreen];

        });

    }

    -(void)clearScreen{

        [self.lineButton removeAllObjects];

        for (int i=0; i<self.buttons.count ; i++) {

            UIButton *button = self.buttons[i];

            button.highlighted = NO;

            button.selected = NO;

        }

    //    恢复原始状态

        [self setNeedsDisplay];

    }

    -(void)drawRect:(CGRect)rect{

    //    创建路径对象

        UIBezierPath *path = [UIBezierPath bezierPath];

        

        for(int i=0;i<self.lineButton.count;i++){

            if(i==0){

                [path moveToPoint:[self.lineButton[i] center]];

            }else{

                [path addLineToPoint:[self.lineButton[i] center]];

            }

        }

        if(self.lineButton.count){

    //     连接到手指的位置

            [path addLineToPoint:self.currentPoint];

        }

    //    设置颜色

        [[UIColor redColor] set];

        

    //    设置线宽

        path.lineWidth = 10;

        

    //    设置连接处的样式

        [path setLineJoinStyle:kCGLineJoinRound];

        

    //    设置头尾的样式

        [path setLineCapStyle:kCGLineCapRound];

        

    //    渲染

        [path stroke];

    }

    -(void)layoutSubviews{

        

        [super layoutSubviews];

        

        CGFloat w = 74;

        CGFloat h = w;

        CGFloat margin = (self.frame.size.width-3*w)/4;

        

        for(int i=0;i<self.buttons.count;i++){

        

            UIButton *button = self.buttons[i];

            CGFloat row = i % 3;

            CGFloat col = i / 3;

            CGFloat x = row * (margin + w) + margin;

            CGFloat y = col * (margin + h) + margin;

            button.frame = CGRectMake(x, y, w, h);

        }

    }

    @end

  • 相关阅读:
    把Linq查询返回的var类型的数据 转换为DataTable EF连接查询
    无法更新 EntitySet 因为它有一个 DefiningQuery
    MVC上传文件
    MySql删除表、数据
    LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”。
    MVC仓储使用join
    MVC仓储执行存储过程报错“未提供该参数”
    Newtonsoft.Json自动升级版本号,导致dll冲突
    MVC中构建Linq条件、排序、Selector字段过滤
    AutoMapper
  • 原文地址:https://www.cnblogs.com/fshmjl/p/4852250.html
Copyright © 2011-2022 走看看