iOS开发-支付宝手势解锁实现展示

支付宝手势解锁功能仿制指南 本文还有配套的精品资源,点击获取 简介:手势解锁是一种广泛应用于移动设备的安全机制,本篇文章将介绍如何在iOS平台上仿制支付宝的手势解锁功能。主要涉及触摸事件处理、自定义视图绘图,以及如何在视图中绘制手势路径和验证解锁手势。还包括如何初始化视图、存储和加载用户的手势路径,以及优化用户体验的其他功能。 1. 触摸事件处理 触摸事件处理是移动应用开发中不可或缺的一部... 阅读详情

仿造支付宝写的一个手势解锁的Demo,那么废话不多说直接上代码!

 

 

//

//  ViewController.h

//  Quartz 2D - 手势解锁

//

//  Created by 周昭 on 16/4/12.

//  Copyright © 2016年 Jordan Zhou. All rights reserved.

//

 

#import <UIKit/UIKit.h>

 

@interface ViewController : UIViewController

 

 

@end

 

//

//  ViewController.m

//  Quartz 2D - 手势解锁

//

//  Created by 周昭 on 16/4/12.

//  Copyright © 2016年 Jordan Zhou. All rights reserved.

//

 

#import "ViewController.h"

#import "ZZLockView.h"

 

@interface ViewController ()<ZZLockViewDelegate>

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    // 设置背景

    [self setUpBackImg];

    

    // 添加lockView

    [self setUpLockView];

}

 

/**

 *  设置背景

 */

- (void)setUpBackImg

{

    UIImageView *bgImg = [[UIImageView alloc] initWithFrame:self.view.frame];

    bgImg.image = [UIImage imageNamed:@"Home_refresh_bg"];

    [self.view addSubview:bgImg];

}

 

/**

 *  添加lockView

 */

- (void)setUpLockView

{

    ZZLockView *lockView = [[ZZLockView alloc] init];

    lockView.delegate = self;

    lockView.backgroundColor = [UIColor clearColor];

    lockView.center = CGPointMake(self.view.frame.size.width * 0.5, self.view.frame.size.height * 0.5);

    lockView.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

    [self.view addSubview:lockView];

}

 

/**

 *  代理方法

 */

- (void)lockView:(ZZLockView *)lockView didFinishPath:(NSString *)path

{

    NSLog(@"拿到我们的path进行操作进行对比");

}

 

@end

 

//

//  ZZLockView.h

//  Quartz 2D - 手势解锁

//

//  Created by 周昭 on 16/4/12.

//  Copyright © 2016年 Jordan Zhou. All rights reserved.

//

 

#import <UIKit/UIKit.h>

 

@class ZZLockView;

 

@protocol ZZLockViewDelegate <NSObject>

 

@optional

 

- (void)lockView:(ZZLockView *)lockView didFinishPath:(NSString *)path;

 

@end

 

@interface ZZLockView : UIView

 

@property (nonatomic, weak) id <ZZLockViewDelegate> delegate;

 

@end

 

//

//  ZZLockView.m

//  Quartz 2D - 手势解锁

//

//  Created by 周昭 on 16/4/12.

//  Copyright © 2016年 Jordan Zhou. All rights reserved.

//

 

#import "ZZLockView.h"

#import "ZZCircleBtn.h"

@interface ZZLockView()

 

@property (nonatomic, strong) NSMutableArray *selectedButtons;

@property (nonatomic, assign) CGPoint currentMovePoint;

@end

 

@implementation ZZLockView

 

- (NSMutableArray *)selectedButtons

{

    if (!_selectedButtons) {

        _selectedButtons = [NSMutableArray array];

    }

    return _selectedButtons;

}

 

/**

 *  初始化

 */

- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        [self setUp];

    }

    return self;

}

 

/**

 *  无论你从什么创建Xib\代码创建都可以

 */

- (instancetype)initWithCoder:(NSCoder *)aDecoder

{

    if (self = [super initWithCoder:aDecoder]) {

        [self setUp];

    }

    return self;

}

 

/**

 *  添加按钮

 */

- (void)setUp

{

    for (int index = 0; index < 9; index++) {

        

#pragma mark --- 封装一层封装一层circleBtn

        // 创建背景

        ZZCircleBtn *btn = [ZZCircleBtn buttonWithType:UIButtonTypeCustom];

        

        // 绑定tag得到路径(所以这里我们在数组中存的直接是这个按钮\当然你存按钮的中点也是可以的但是路径呢?)

        btn.tag = index;

        

        // 添加按钮

        [self addSubview:btn];

    }

}

 

/**

 *  已经添加那么在这里设置他的frame

 */

- (void)layoutSubviews

{

    for (int index = 0; index < self.subviews.count; index++) {

        

        // 取出按钮

        ZZCircleBtn *btn = self.subviews[index];

        int totolColumns = 3;

        int col = index % totolColumns;

        int row = index / totolColumns;

        CGFloat btnW = 74;

        CGFloat btnH = 74;

        CGFloat marginX = (self.frame.size.width - totolColumns * btnW) / (totolColumns + 1);

        CGFloat marginY = marginX;

        

        CGFloat btnX = marginX + col * (marginX + btnW);

        CGFloat btnY = marginY + row * (marginY + btnH);

        btn.frame = CGRectMake(btnX, btnY, btnW, btnH);

    }

}

 

#pragma mark ---- 私有方法

/**

 *  根据touches的集合获得对应触摸点的位置

 */

- (CGPoint)pointWithTouches:(NSSet *)touches

{

    // 1.取出按钮的点

    UITouch *touch = [touches anyObject];

    return  [touch locationInView:touch.view];

}

 

 

/**

 *  根据我们的触摸点判断是不是选中的按钮

 */

- (ZZCircleBtn *)buttonWithPoint:(CGPoint)point

{

    // 遍历 CGRectContainsPoint(btn.frame, pos) 返回BOOL值 看这个点在不在这个范围内

    for (ZZCircleBtn *btn in self.subviews) {

#pragma mark ---- 判断到圆心的才连接

        CGFloat wh = 24;

        CGFloat frameX = btn.center.x - wh * 0.5;

        CGFloat frameY = btn.center.y - wh * 0.5;

        

        if (CGRectContainsPoint(CGRectMake(frameX, frameY, wh, wh), point)) {

            return btn;

        }

    }

    return nil;

}

 

 

#pragma mark ---- 触摸方法

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    // 0.我们一按下去就把这个点清空

    self.currentMovePoint = CGPointZero;

 

    // 1.获得触摸点

    CGPoint pos = [self pointWithTouches:touches];

 

    // 2.获得触摸的按钮

    ZZCircleBtn *btn = [self buttonWithPoint:pos];

 

    if (btn && btn.selected == NO) {

        // 3.按钮被选中

        btn.selected = YES;

        

        // 4.添加到数组中(如果你直接这么写一看就没经验 [self.selectedButtons addObject:btn]; btn 可能为空 所有以后数组和字典中添加东西一定判断为不为空)

        [self.selectedButtons addObject:btn];

    }

}

 

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    // 1.获得触摸点

    CGPoint pos = [self pointWithTouches:touches];

    

    // 2.获得触摸的按钮

    ZZCircleBtn *btn = [self buttonWithPoint:pos];

    

    if (btn && btn.selected == NO) {

        // 3.按钮被选中

        btn.selected = YES;

 

        // 4.添加到数组中(如果你直接这么写一看就没经验 [self.selectedButtons addObject:btn]; btn 可能为空 所有以后数组和字典中添加东西一定判断为不为空)

        [self.selectedButtons addObject:btn];

    } else { // 没有摸到按钮

        self.currentMovePoint = pos;

    }

    

    // 5.刷新

    [self setNeedsDisplay];

}

 

 

/**

 *  触摸结束

 */

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    if ([self.delegate respondsToSelector:@selector(lockView:didFinishPath:)]) {

        // 得到画的路径

        NSMutableString *path = [NSMutableString string];

        

        for (ZZCircleBtn *btn in self.selectedButtons) {

            [path appendFormat:@"%ld",btn.tag];

        }

        NSLog(@"%@",path);

        [self.delegate lockView:self didFinishPath:path];

    }

    

//     取消选中的所有按钮\能尽量优化的时候就应该优化那么这里没必要遍历所有的子控件

    for (ZZCircleBtn *btn in self.selectedButtons) {

        btn.selected = NO;

    }

    // 让所有的按钮都执行这个方法 \ 注意最后一个返回值一定要包装成对象就行

//    [self.selectedButtons makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];

    

    [self.selectedButtons removeAllObjects];

    [self setNeedsDisplay];

}

 

/**

 *  触摸被打破我们直接调用touchesEnded的方法

 */

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    [self touchesEnded:touches withEvent:event];

}

 

 

#pragma mark --- 绘图

- (void)drawRect:(CGRect)rect

{

    if (self.selectedButtons.count == 0) return;

    

    UIBezierPath *path = [UIBezierPath bezierPath];

    

    for (int index = 0; index < self.selectedButtons.count; index++) {

        ZZCircleBtn *btn = self.selectedButtons[index];

        

        if (index == 0) {

            [path moveToPoint:btn.center];

        } else {

            [path addLineToPoint:btn.center];

        }

    }

    

    // 如果当前点没有那么我们就要清除

    if (CGPointEqualToPoint(self.currentMovePoint, CGPointZero) == NO) {

        [path addLineToPoint:self.currentMovePoint];

    }

    

    // 设置连接样式

    path.lineJoinStyle = kCGLineJoinBevel;

    path.lineWidth = 10;

 

    [[UIColor colorWithRed:32/255.0 green:210/255.0 blue:254/255.0 alpha:0.7] set];

    [path stroke];

}

 

@end

 

//

//  ZZCircleBtn.h

//  Quartz 2D - 手势解锁

//

//  Created by 周昭 on 16/4/12.

//  Copyright © 2016年 Jordan Zhou. All rights reserved.

//

 

#import <UIKit/UIKit.h>

 

@interface ZZCircleBtn : UIButton

 

@end

 

 

//

//  ZZCircleBtn.m

//  Quartz 2D - 手势解锁

//

//  Created by 周昭 on 16/4/12.

//  Copyright © 2016年 Jordan Zhou. All rights reserved.

//

 

#import "ZZCircleBtn.h"

 

@implementation ZZCircleBtn

 

/**

 *  初始化

 */

- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        [self setUp];

    }

    return self;

}

 

/**

 *  无论你从什么创建Xib\代码创建都可以

 */

- (instancetype)initWithCoder:(NSCoder *)aDecoder

{

    if (self = [super initWithCoder:aDecoder]) {

        [self setUp];

    }

    return self;

}

 

/**

 *  添加按钮

 */

- (void)setUp

{

    // 直接让按钮不能响应事件否则按钮长按会变色

    self.userInteractionEnabled = NO;

    

    // 设置默认按钮图片

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

    

    // 设置选中是按钮的图片(为什么是selected?当你的按钮离开的时候就不是highlighted所以要选中)

    [self setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];

}

 

@end

 

 

 

Dify安装使用说明 dify可以说是一个功能不错的LLMOps,可以通过dify集中管理模型,可以通过界面创建AI应用,可以上传文档形成知识库,可以创建自定义工具(API),并可以对外提供API。相关功能类似Openai的GPTs或智谱的智能体,其他大厂的大模型也有类似功能,不过貌似只有dify是开源的。这就为个人本地部署AI应用提供了便利。 阅读详情

相关推荐

探索Vortex开源GPGPU:RISC-V SIMT架构(4-1),Execute SFU(1)

本文详细分析了Vortex RISC-V内核6级流水线中Execute阶段的SFU(特殊功能单元)模块。重点介绍了SFU的数据流结构,包含dispatch_unit、pe_switch、csr_unit、wctl_unit和gather_unit五个子模块。文章深入解析了warp控制指令wspawn和tmc的实现机制:wspawn用于激活指定数量的warp并设置新PC值,tmc则用于控制线程掩码和warp状态。通过C代码和汇编指令的对照分析,阐明了这些指令在并行计算中的关键作用,包括线程激活、状态切换和执行

weixin_55313207的博客 1363

iOS-高仿支付宝手势解锁(九宫格)

高仿支付宝手势解锁, 通过手势枚举去实现手势密码相对应操作。

findhappy117的博客 509

51单片机通过计时器实现倒计时

51单片机通过计时器操作两位8段阳极数码管,实现倒计时

一份耕耘,一分收获 3万+

iOS 手势滑动解锁功能简析

题记 在平常的生活中,我们大概经常遇见手势滑动解锁---也就是九宫格啊,已经出现好久了,虽然随着Apple的指纹解锁的发展手势解锁虽然还有但是因为其不如指纹解锁方便也用的也少了,但是在大多数APP中这两种方式都是并存的,比如qq,微信,支付宝等等,最近项目里面也刚好有这个需求,趁着刚完成抽出时间来记录下来当时的一些思路,可能有的地方理解的不到位,还需多总结,闲言少叙了,看重点。 功...

劉光軍_Shine的博客 610

MATLAB实战:用Costas环和Gardner环搞定QPSK同步问题(附完整代码)

本文详细介绍了如何使用MATLAB实现Costas环和Gardner环联合解决QPSK同步问题,包括载波同步和定时同步的技术原理、MATLAB代码实现及性能分析。通过完整的仿真示例和工程实践建议,帮助读者掌握QPSK同步技术的核心要点,提升数字通信系统的解调性能。

agile9scrum的博客 689

python画弗里德曼(Friedman) 检验和秩和检验(Nemenyi)检验图

python画弗里德曼(Friedman) 检验和秩和检验(Nemenyi)检验图 画好后效果图 实现代码如下 import matplotlib.pyplot as plt #算法平均排名 _alg_=[1.405,2.643,2.786,2.167] y=[1,2,3,4]#alg1,alg2,alg3,alg4 通过Nemenyi测试计算得到的临界值CD CD=1.024 h_CD=CD/2 plt.figure(figsize=(10,6)) plt.scatter(_alg_,y,s=10

大模型天花板 4464

手势解锁的实现

思路总结: 1>touchBegin (获取当前的触摸点,如果当前的触摸点在按钮的范围内,并且该按钮的状态不是高亮,就将该按钮添加到数组中) 2>touchMove(将当前的触摸点赋值给标记属性 【self setNeedsDisplay】) 3>touchEnd(如果当前点不在按钮范围内,就将当前点赋值为数组中的最后一个点) 4>

u013370845的博客 684

光流法实战:如何用OpenCV的Farneback算法实现图像对齐(附调参技巧)

本文详细介绍了如何使用OpenCV的Farneback稠密光流算法实现图像对齐,包括核心原理、参数调优和工程实现。通过实战代码和参数优化策略,帮助开发者解决动态场景中的图像对齐问题,提升多帧融合和视频处理的效果。

weixin_29266007的博客 290

高仿支付宝手势解锁

涉及知识: 贝塞尔曲线的使用 协议、代理模式的使用实现思路 1.新建一个类,继承UIView,取名为ZFLockView。在initWithFrame方法中调用自定义方法layoutBtn对按钮进行九宫格布局。这里需要注意的是按钮必须关掉交互的功能,也就是btn.userInteractionEnabled = NO;否则,下面获取按钮的坐标时候获取不到。因为是用for循环来创建按钮,那么每个按

追求灵魂代码 981

STM32F4用FSMC驱动AX58100 EtherCAT从站芯片,保姆级配置流程与避坑指南

本文详细介绍了STM32F4通过FSMC接口驱动AX58100 EtherCAT从站芯片的完整配置流程,包括硬件连接、时序优化、协议栈移植及TwinCAT主站集成。针对工业自动化场景,提供高性价比的实时控制解决方案,特别适合机械臂、CNC机床等精确同步应用,并分享关键调试技巧与性能优化方法。

weixin_27869497的博客 305

实战!C#整合YOLO+Halcon做玻璃瓶口缺陷检测:裂纹识别+尺寸测量一步到位(附DLL交互代码)

AI擅长语义识别(裂纹、缺陷),传统机器视觉擅长精密测量(尺寸、位置),C#做整合层,才能满足工业生产的“精度+效率+稳定性”要求。这套方案不只是玻璃瓶检测能用,改改模型和测量逻辑,还能用到瓶盖缺陷检测、饮料瓶液位检测等场景。如果你们厂也有类似的质检痛点,评论区留个言,我帮你看看怎么调整算法参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 868

[ios仿系列]仿支付宝手势解码

呀~,这么快就转到ios阵营了???,android还有那么多坑呢???为此我也只能啃着馒头留下屈辱的眼泪了。。 本次由于开发公司产品的android版,继而ios版也负责一部分,其中一部分就是手势解锁的问题(为了要与android版一致,也算是非了一部分心血) 然而,但我打开iPhone,发现支付宝客户端已经没有手势解锁了,取而代之的时指纹解锁,关于指纹解锁,暂时还来不及研究,只能以后有机会

jov123的专栏 2507

基于分水岭分割进行肺癌诊断

近年来,肺癌的发病率和病死率均迅速上升,目前已居所有癌症之首。随着肺癌病人数量的增加,医生对肺部 CT 图像进行研判的工作量也增加了不少,在这种情况下难免工作效率降低甚至会出现误诊。为了帮助医生减少重复性工作,对肺部 CT 图像进行计算机辅助检测的技术就被广泛应用于对肺癌的诊断和治疗过程中。医学 CT 图像处理主要是研究医学图像中的器官和组织之间的关系,并进行病理性分析。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1568

探索未来交互:PCGestureUnlock —— 高仿支付宝手势解锁库

探索未来交互:PCGestureUnlock —— 高仿支付宝手势解锁库 在这个数字时代,安全与便捷并存是用户体验的关键。而【PCGestureUnlock】就是这样一款开源项目,它提供了最全面、最高仿支付宝的手势解锁功能,为你的iOS应用带来独一无二的安全入口。不仅如此,这个框架还允许你轻松调整参数以适应各种实际项目的需求,让定制变得轻而易举。 1、项目介绍 PCGestureUnlock 是一...

gitblog_00085的博客 518

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ios hack实战:获取支付宝手势密码(支付宝版本8.0)

最近在学习ios逆向工程方面的知识,看了一些资料,自己也找个项目来实践下。 1、以支付宝v8.0为目标(谁叫人家是这方面的大牛^_^)。 2、工具:越狱手机一台,Cycript,class-dump-z等基本hook工具。 首先,获取到手势解锁页面,本来想按照前辈的教程,但是应该是经过改版后修改了代码逻辑,获取不到手势界面了 jian-de-iPhone:~ root# c

u010024765的专栏 2326

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

高仿支付宝手势解锁(增强版)

CoreLock 高仿支付宝解锁! 注:本框架是高仿支付宝,并集成了所有功能,并非一个简单的解锁界面展示。个人制作用时1周多,打造解锁终结者框架。 框架特性: .ios版本兼容ios 7.0及以上. .扁平化设计,全部使用QuartzCore引擎绘制,没有使用任何图片素材 .完全解耦,不需要继承,不需要定义成员属性,类方法直接搞定一切。 .自动管理生命周期,你只需要使

z522146620的博客 731

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

推荐使用:KKGestureLockView - 简易高效的手势解锁控件

推荐使用:KKGestureLockView - 简易高效的手势解锁控件 项目介绍 KKGestureLockView 是一款轻巧而强大的 iOS 开源组件,它使得在您的应用程序中集成类似 Android 手势解锁的功能变得异常简单。灵感来源于支付宝的新版 app,这款控件旨在提供一个直观且易于操作的解锁方式,为用户的交互体验增添一抹新意。 项目技术分析 该控件的核心特点是其高度定制化的能力。以下...

gitblog_00003的博客 330

(素材源码)猫猫学IOS(三十五)UI之Quartz2D仿真支付宝手势解锁_代理获得密码。

猫猫分享,必须精品原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.youkuaiyun.com/u013357243?viewmode=contents 源码:http://download.youkuaiyun.com/detail/u013357243/8669765效果:代码:NYLockView.h// // NYLockView.h // 手势解锁 // // Creat

翟乃玉 2711

iOS安全攻防(十四):Hack实战——支付宝app手势密码校验欺骗

在 iOS安全攻防(十一):Hack实战——探究支付宝app手势密码 中,介绍了如何利用gdb分析app,确定了支付宝app的手势密码格式为字符串,9个点分别对应123456789。在 iOS安全攻防(十二):iOS7的动态库注入 中,介绍了如果利用越狱大神们为我们开辟的iOS7动态库注入方法。 本文将继续深入hack实战,hook支付宝手势密码校验操作,欺骗其通过任意手势输入。

sharpyl的专栏 1326

猫猫学IOS(三十五)UI之Quartz2D仿真支付宝手势解锁_代理获得密码。

猫猫分享,必须精品原创文章,欢迎转载。转载请注明:翟乃玉的博客 地址:http://blog.youkuaiyun.com/u013357243?viewmode=contents 源码:http://blog.youkuaiyun.com/u013357243/article/details/45533403效果:实现步骤其实这个实现起来不难第一步先放好主要的UI,一张背景图和一个View 第二部就是把9个bu

翟乃玉 1837

iOS 高仿支付宝手势解锁(九宫格)

基上篇TouchID 指纹解锁 的技术文, 然后目前又练习一种解锁方式: 九宫格手势解锁. 在一些涉及个人隐私的场景下,为用户的安全考虑是极其有必要的。 首先,我们先分析功能的实现过程,首先我们需要先看大致的实现过程: 1.创建九宫格页面(手势密码页面) 2.九宫格按钮的实现及被点击及滑动过程中按钮状态的改变, 从而创建路径,实现滑动过程中的连线,绘制图形 3.创建九宫格指示器 小图 4.将定...

weixin_34366546的博客 155
上一篇: iOS开发-Quartz 2D中UIImage的分类
下一篇: iOS开发-QQ聊天布局实现(聊天机器人应用)
ZZ_iOSDeveloper
博客等级 码龄11年 21粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值