解锁手势功能,显示痕迹和不显示痕迹只要看注释就可以

#import "LoginGestureCodeViewController.h"
#import "UserModel.h"
#import "AppDelegate.h"
#import "LoginViewController.h"

#define BtnTag 5000

@interface LoginGestureCodeViewController ()

@property (nonatomic,strong)NSMutableArray *buttonArr;//全部手势按键的数组
@property (nonatomic,strong)NSMutableArray *selectorArr;//选中手势按键的数组
@property (nonatomic,assign)CGPoint startPoint;//记录开始选中的按键坐标
@property (nonatomic,assign)CGPoint endPoint;//记录结束时的手势坐标
@property (nonatomic,strong)UIImageView *imageView;//画图所需
@property (nonatomic,strong)NSMutableString *handMoveString;//最终手势的字符串
@end

@implementation LoginGestureCodeViewController

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    self.navigationItem.title = @"验证手势";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = getColor(bgColor);

    if (!_buttonArr) {
        _buttonArr = [[NSMutableArray alloc] initWithCapacity:9];
    }

    self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - 64)];
    [self.view addSubview:self.imageView];

    //提示label
    UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT/5 - 40 / WIDTH_5S_SCALE, SCREEN_WIDTH, 14/ WIDTH_5S_SCALE)];
    textLabel.font = DEF_FontSize_14;
    textLabel.textColor = getColor(mainColor);
    textLabel.textAlignment = NSTextAlignmentCenter;
    textLabel.text = @"请输入手势密码";
    [self.view addSubview:textLabel];

    //创建按钮
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
            //设置TAG值
            if (i == 0) {
                btn.tag = BtnTag + j;
            }else if (i == 1){
                btn.tag = BtnTag + 3 + j;
            }else{
                btn.tag = BtnTag + 6 + j;
            }

            btn.frame = CGRectMake(SCREEN_WIDTH/6+SCREEN_WIDTH/4*j, SCREEN_HEIGHT/5+SCREEN_WIDTH/4*i, SCREEN_WIDTH/5, SCREEN_WIDTH/5);
            [btn setImage:[UIImage imageNamed:@"login_shoushi1"] forState:UIControlStateNormal];
            [btn setImage:[UIImage imageNamed:@"login_shoushi2"] forState:UIControlStateHighlighted];
            btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
            btn.userInteractionEnabled = NO;
            [self.buttonArr addObject:btn];
            [self.imageView addSubview:btn];
        }
    }

    //确认按钮
    UIButton *commitButton = [[UIButton alloc] initWithFrame:CGRectMake(30 / WIDTH_5S_SCALE, SCREEN_HEIGHT - 64 - 40 - 50 / WIDTH_5S_SCALE, SCREEN_WIDTH - 60 / WIDTH_5S_SCALE, 40)];
    commitButton.titleLabel.font = DEF_FontSize_18;
    [commitButton setTitle:@"重置手势" forState:UIControlStateNormal];
    [commitButton setTitleColor:getColor(whiteColor) forState:UIControlStateNormal];
    [commitButton setBackgroundColor:getColor(mainColor)];
    commitButton.layer.cornerRadius = 5;
    commitButton.layer.masksToBounds = YES;
    [commitButton addTarget:self action:@selector(commitBtnAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:commitButton];
}

//画线
- (UIImage *)drawLine{
    UIImage *image = nil;
    UIColor *col = getColor(mainColor);

    //设置画图的大小为imageview的大小
    UIGraphicsBeginImageContext(self.imageView.frame.size);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 2);
    CGContextSetStrokeColorWithColor(context, col.CGColor);

    //设置画线起点
    CGContextMoveToPoint(context, self.startPoint.x, self.startPoint.y);

    //从起点画线到选中的按键中心,并切换画线的起点
    for (UIButton *btn in self.selectorArr) {
        CGPoint btnPo = btn.center;
        CGContextAddLineToPoint(context, btnPo.x, btnPo.y);
        CGContextMoveToPoint(context, btnPo.x, btnPo.y);
    }
    //画移动中的最后一条线
    CGContextAddLineToPoint(context, self.endPoint.x, self.endPoint.y);

    CGContextStrokePath(context);

    image = UIGraphicsGetImageFromCurrentImageContext();//画图输出
    UIGraphicsEndImageContext();//结束画线

    return image;
}

//开始手势
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    self.imageView.image = nil;
    self.selectorArr = nil;
    for (UIButton *btn in self.buttonArr) {
        btn.highlighted = NO;
    }
    UITouch *touch = [touches anyObject];
    if (touch) {
        //记录起点
        self.startPoint = [touch locationInView:self.imageView];

        for (UIButton *btn in self.buttonArr) {
            //记录按键坐标
            CGPoint po = [touch locationInView:btn];

            //判断按键坐标是否在手势开始范围内,是则为选中的开始按键
            if ([btn pointInside:po withEvent:nil]) {
                [self.selectorArr addObject:btn];
                btn.highlighted = YES;
                //保存起始坐标
                self.startPoint = btn.center;
            }
        }
    }
}

//移动中
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    if (touch) {
        self.endPoint = [touch locationInView:self.imageView];

        for (UIButton *btn in self.buttonArr) {
            CGPoint po = [touch locationInView:btn];

            if ([btn pointInside:po withEvent:nil]) {
                BOOL isAdd = YES;//记录是否为重复按键
                for (UIButton *seBtn in self.selectorArr) {
                    if (seBtn == btn) {
                        isAdd = NO;//已经是选中过的按键,不再重复添加
                        break;
                    }
                }
                if (isAdd) {//未添加的选中按键,添加并修改状态
                    [self.selectorArr addObject:btn];
                    btn.highlighted = YES;
                }
            }
        }
    }

    //每次移动过程中都要调用这个方法,把画出的图输出显示
    self.imageView.image = [self drawLine];

}

//手势结束
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    //手势图画消失,打印已选择的数组
    self.imageView.image = nil;
    for (UIButton *btn in self.buttonArr) {
        btn.highlighted = NO;
    }
    self.startPoint = CGPointZero;
    NSMutableString *str = @"".mutableCopy;
    for (UIButton *btn in self.selectorArr) {
        NSLog(@"aaa -- %ld",btn.tag - BtnTag);
        str = (NSMutableString*)[str stringByAppendingString:[NSString stringWithFormat:@"%ld",btn.tag - BtnTag]];
    }
    self.handMoveString = str;

    // 注:可变代码
    NSString *locanHandMove = [UserModel sharedInstanced].handMove;
    if ([locanHandMove isEqualToString:str]) {
        AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
        [appDelegate loginStateChange];
    }else{
        ShowMessage(@"手势密码错误");
    }

//    //手势图画不消失,打印已选择的数组
//    self.startPoint = CGPointZero;
//    for (UIButton *btn in self.selectorArr) {
//        NSLog(@"aaa -- %ld",btn.tag - BtnTag);
//    }
}

#pragma mark -- btnAction

- (void)commitBtnAction{
    NSLog(@"确认按钮");
//    NSLog(@"--- %@",self.selectorArr);
//    for (UIButton *btn in self.selectorArr) {
//        NSLog(@"aaa -- %ld",btn.tag - BtnTag);
//    }
    //  切换根控制器(可变代码)
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:[[LoginViewController alloc]init]];
    [UIApplication sharedApplication].delegate.window.rootViewController = nav;

}

#pragma mark -- init

- (NSMutableArray *)selectorArr{
    if (!_selectorArr) {
        _selectorArr = [[NSMutableArray alloc] init];
    }
    return _selectorArr;
}

@end
时间: 2024-08-07 06:19:03

解锁手势功能,显示痕迹和不显示痕迹只要看注释就可以的相关文章

App开发流程之右滑返回手势功能

iOS7以后,导航控制器,自带了从屏幕左边缘右滑返回的手势功能. 但是,如果自定义了导航栏返回按钮,这项功能就失效了,需要自行实现.又如果需要修改手势触发范围,还是需要自行实现. 广泛应用的一种实现方案是,采用私有变量和Api,完成手势交互和返回功能,自定义手势触发条件和额外功能. 另一种实现方案是,采用UINavigationController的代理方法实现交互和动画: - (nullable id <UIViewControllerInteractiveTransitioning>)na

从技术角度深入剖析:改号软件,电话号码任意显示,伪造来电显示

刚才看到乌云有人发帖问:网上流传的修改来电的软件实现原理是什么? 关于这个东西,我还真了解一点(本人涉猎甚广,啥都喜欢研究一番)…… 其实很多年前就有此类技术分析文档,几年前我曾看过一篇技术分析文章,详细讲了这个实现原理,年代久远,尼玛文章找不到了,但是大概内容还记得点,结合搜索,整理了点东西出来. 估计有很多人知道,这种技术是由于不同网络中转发数据用的网关在作怪,但是并不明白更底层的原理,本文将从最底层.最基础的电话传输协议.数据帧开始讲…… 关于修改来电显示号码的原理,这个真的是十分古老的东

sharepoint 部分site下的库不能显示正常名称,显示为&ldquo;error&rdquo;

错误现象: 部分site下的库不能显示正常名称,显示为"error",Navigation的部分也會顯示Feature '525dc00c-0745-47c0-8073-221c2ec22f0f' for list template '101' is not installed in this farm.  The operation could not be completed. 从故障现象分析,是缺少某个模板功能导致的,根据错误提示发现,所有错误site提示错误的GUID和对应的L

[android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

    最近做android百度地图,但是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--只显示网格而没有显示地图,网络连接和APIKey申请都是正确的,就是不知道为什么不能显示,网上也有很多人遇到这个问题,有的是SDK更新不兼容.而且网上很多百度地图都是使用V2.3.1版本,后来没有办法只有通过baidumapapi_v2_4_1.jar完成显示地图. 其中需要注意的是使用2.3.1时调用manager.init(

js数据显示在文本框中(页面加载显示和按钮触动显示)

web代码如下: <!DOCTYPE html> <html> <head> <title>jsTest02.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is

模拟聊天室显示语句保持最新显示

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模拟聊天室显示语句保持最新显示</title> <style> *{ border-collapse: collapse; } .dialog_box{ width:400px; height: 600px; margin:0 auto; bac

aChartEngine图表显示(一页显示多张图表)

在看本篇的时候,请确认已经看过了 某android平板项目开发笔记----aChartEngine图表显示(1) 不然,有些地方这里就不再说明… 关于XYMutilpleSeriesDataset 一些注意的地方 我们可以使用的所有Series对象关系如下图 从图中,我们可以看出,XYMutilpleSeriesDataset 只能添加XYSeries,对于,线性图而言,我们需要明确输入x,y值,这样问题不是很大,但是,对于条形图,饼图,对于x轴的属性就有点多余了,对于非线性图而言,我们需要的数

CentOS下shell显示-bash-4.1#不显示用户名路径的解决方法

CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的[email protected]的组合,看起来很不舒服. 原因就是你创建用户的时候,如果指定了-M参数,而因此没有创建用户家目录,所以系统就不会在创建用户的时候,自动拷贝/etc/skel目录下的用户环境变量文件到用户家目录,也就导致这些文件不存在,出现-bash-4.1#的问题了,手动拷贝一下就行 解决方法一.未验证

Linux 下shell显示-bash-4.1$不显示用户名路径的解决方法

Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: 而不是我们经常看到的[email protected]的组合,看起来很不舒服. 解决方案: 问题的原因是因为没有配置.bash_profile的问题,可以通过配置这个文件来解决问题. 1.在Terminal输入: vi ~/.bash_profile 2.如果没有.bash_profile可以自己添加.然后往文件中添加如下内容:e