[iOS]划屏解锁(重写UIView)

2024-08-20 23:58
文章标签 重写 ios uiview 解锁 划屏

本文主要是介绍[iOS]划屏解锁(重写UIView),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

划屏解锁(重写UIView)

Demo:http://download.csdn.net/detail/u012881779/8667545

1.创建一个继承于UIView的类:PaddleDraw

2.创建一个继承于UIViewController的类ViewController

再往ViewController的Xib中添加控件UIView,设置UIView继承于这个自定义的PaddleDraw


 
#import <UIKit/UIKit.h>@interface PaddleDraw : UIView <UIAlertViewDelegate >
@property (strong, nonatomic) NSMutableArray  *pointAdd;     // 存储被触摸到的button的中心点
@property (strong, nonatomic) NSMutableArray  *centerPoint;  // 存储初始化创建的Button中心点
@property (strong, nonatomic) NSMutableArray  *buttonArr;    // 存储所有Button
@property (strong, nonatomic) NSMutableString *strScore;     // 第一次设置密码,按触摸顺序
@property (strong, nonatomic) NSMutableString *compareScore; // 第二次输入密码
@property (strong, nonatomic) UIView *topView;               // 透明玻璃纸// 还原Button状态
- (void)cleanButton;@end#import "PaddleDraw.h"@implementation PaddleDraw
@synthesize pointAdd = _pointAdd;
@synthesize centerPoint = _centerPoint;
@synthesize buttonArr = _buttonArr;
@synthesize strScore = _strScore;
@synthesize compareScore = _compareScore;
@synthesize topView = _topView;- (id)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {// Initialization code}return self;
}// 自己写一个构造函数,按照上面函数的格式
- (id)initWithCoder:(NSCoder *)aDecoder {self = [super initWithCoder:aDecoder];if (self) {// 存储Button中心点_centerPoint = nil;if (!_centerPoint) {_centerPoint = [[NSMutableArray alloc] init];}[_centerPoint removeAllObjects];// 存储所有Button_buttonArr = nil;if (!_buttonArr) {_buttonArr = [[NSMutableArray alloc ] init];}// 定义Button格数for (int i = 0 ; i < 20 ; i ++) {UIButton *screenButton = [[UIButton alloc] init];[screenButton setFrame:CGRectMake(5+(i%4)*87.6, 100+(i/4)*87.6, 32, 32)];[screenButton setBackgroundImage:[UIImage imageNamed:@"gray.png"] forState:UIControlStateNormal];[screenButton setTag:i+1];CGPoint pointBut = [screenButton center];[_centerPoint addObject:[NSValue valueWithCGPoint:pointBut]];[_buttonArr addObject:screenButton];[self addSubview:screenButton];}// 放一个透明的View接受响应,避免Button吸收响应if (!_topView) {_topView = [[UIView alloc] initWithFrame:CGRectMake(0, 20, 320, 568)];[_topView setBackgroundColor:[UIColor clearColor] ];[self addSubview:_topView];}}  return self;  
}// Only override drawRect: if you perform custom drawing.
- (void)drawRect:(CGRect)rect {// Drawing codeif(_pointAdd){CGContextRef context = UIGraphicsGetCurrentContext();CGPoint startPoint = [[_pointAdd firstObject] CGPointValue];CGContextMoveToPoint(context, startPoint.x, startPoint.y);for(int j = 0;j < [_pointAdd count];j ++){CGPoint tempArr = [[_pointAdd objectAtIndex:j] CGPointValue];CGContextAddLineToPoint(context, tempArr.x,tempArr.y);}[[UIColor colorWithRed:250/255.0 green:200/255.0 blue:99/255.0 alpha:1] set];CGContextSetLineWidth(context, 10);CGContextStrokePath(context);}
}// 还原Button状态
- (void)cleanButton {for (UIButton *tempBut in _buttonArr) {[tempBut setBackgroundImage:[UIImage imageNamed:@"gray.png"] forState:UIControlStateNormal ];}// 密码清空_strScore = nil;// 刷新,重新显示[self setNeedsDisplay];
}#pragma mark UIResponder
// 开始触摸
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {// 还原Button的状态[self cleanButton];
}// 触摸移动,不断监听一次有效的Touch移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {CGPoint point = [[touches anyObject] locationInView:self];if (!_pointAdd) {   // 触摸经过的Button中心_pointAdd = [[NSMutableArray alloc] init];}if (!_strScore) {    // 密码_strScore = [[NSMutableString alloc] init];}// 判断触摸在UI上的点,是否在Button上,for (int i = 0 ; i < 5 ; i ++) {if (point.y > 100+(i%5)*87.6 && point.y < 100+(i%5)*87.6+32) {for (int j = 0 ; j < 4 ; j ++) {if (point.x > 10+(j%4)*87.6 && point.x < 10+(j%4)*87.6+32) {// 取得该Button的中心点坐标,传给PointAddNSMutableArray *aaa = _centerPoint;NSLog(@"___%@",aaa);[_pointAdd addObject:[_centerPoint objectAtIndex:4*i+j]];// 存储密码,Button连接顺序NSString *strTemp = [NSString stringWithFormat:@"%d",4*i+(j+1)];NSRange range = [_strScore rangeOfString:strTemp];   // 查看当前Button是否已经经过一次,if (range.location == NSNotFound) {[_strScore appendString:strTemp];}// 取得Button,改变其状态UIButton *theButton = (UIButton *)[self viewWithTag:4*i+j+1];[theButton setBackgroundImage:[UIImage imageNamed:@"yellow.png"] forState:UIControlStateNormal];// 改变状态后,跳出for循环break;}}break;}}[self setNeedsDisplay];
}// 触摸事件完成
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {// 触摸结束后,清空上次触摸存储到pointAdd中的Button中心坐标数据[_pointAdd removeAllObjects];// 查看密码,比较第二次输入密码是否相同if (!_compareScore) {_compareScore = [[NSMutableString alloc] init];}if (![_strScore isEqualToString:_compareScore]) {UIAlertView *theAlert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"验证密码" delegate:self cancelButtonTitle:@"再次输入" otherButtonTitles:@"取消", nil, nil];[theAlert show];} else {// 成功设置,页面跳转UIAlertView *theAlert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"验证成功" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil, nil];[theAlert show];}
}// 触摸事件取消,比如来电话打断
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {NSLog(@"touchesCancelled");
}#pragma mark UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex{// 再次输入if (buttonIndex == 0) {// 查看密码,比较第二次输入密码是否相同_compareScore = _strScore;[self cleanButton];}// 重新输入if (buttonIndex == 1) {[self cleanButton];}  
}@end 

示图:




 

 

这篇关于[iOS]划屏解锁(重写UIView)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091544

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

Python中的属性装饰器:解锁更优雅的编程之道

引言 在Python的世界里,装饰器是一个强大的工具,它允许我们以一种非侵入性的方式修改函数或方法的行为。而当我们谈论“属性装饰器”时,则是在探讨如何使用装饰器来增强类中属性的功能。这不仅让我们的代码更加简洁、易读,同时也提供了强大的功能扩展能力。本文将带你深入了解属性装饰器的核心概念,并通过一系列实例展示其在不同场景下的应用,从基础到进阶,再到实际项目的实战经验分享,帮助你解锁Python编程

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

Python中的私有属性与方法:解锁面向对象编程的秘密

在Python的广阔世界里,面向对象编程(OOP)是一种强大而灵活的方法论,它帮助我们更好地组织代码、管理状态,并构建可复用的软件组件。而在这个框架内,私有属性与方法则是实现封装的关键机制之一。它们不仅有助于隐藏类内部的具体实现细节,还能保护数据免受外部干扰。今天,让我们一起探索Python中私有属性与方法的魅力所在,了解它们如何在实际开发中发挥重要作用。 引言 随着软件系统变得越来越复杂,维

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

【Linux】探索进程优先级的奥秘,解锁进程的调度与切换

目录 进程优先级: 是什么? 为什么存在进程优先级的概念呢? Linux为什么调整优先级是要受限制的? PRI vs NICE Linux的调度与切换 概念准备: 那我们到底怎样完成进程的调度和切换呢? 区分:寄存器VS寄存器的内容 Linux实现进程调度的算法,需要考虑优先级,考虑进程饥饿问题,考虑效率问题。 解决优先级问题: 解决进程饥饿问题: 解决效率的问题:

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件