iOS开发——使用技术OC篇&简单九宫格锁屏功能的实现与封装
简单九宫格锁屏功能的实现与封装
首先来看看最后的实现界面。

在这开始看下面的内容之前希望你能先大概思考活着回顾一下如果
你会怎么做,只要知道大概的思路就可以。
由于iphone5指纹解锁的实现是的这个功能呗淘汰,但是你可能会在想,都淘汰了你还在这里说个毛线啊,其实大家都知道,编程注重的思想,当然会了这个你不可能就会了指纹技术,哪还得等笔者在后面的学习中给大家分享,只是或许有一天这种功能或者思路在哪里要用到你不觉得是一件很开心的事情吗,而且如果你是不想自己敲的话直接可以拿来用。
好了不多废话直接上。。。
关于节目的搭建这里就不多说了,那都是简单的不能再简单的东西,这里只是介绍怎么一步步去实现这个功能。
这里我使用的是触摸事件,当然你也可是使用手势识别来实现,思路基本一致:
一:头文件的处理
首先我们在头文件中使用代理的当时传值,只要遵守这个代理,并且实现了这个代理方法,再将对应的View设置为我们自定义的View就可以了。
#import <UIKit/UIKit.h> @class iCocosLockView; @protocol iCocosLockView Delegate <NSObject> @optional - (void)lockView:(iCocosLockView *)lockView didFinishPath:(NSString *)path; @end @interface iCocosLockView : UIView @property (nonatomic, weak) IBOutlet id<YZLockViewDelegate> delegate; @end
二:下面就是实现文件中来一步步的实现这个功能
在私有拓展中定义一下相关属性
#import "iCocosLockView.h" #define kCount 9 @interface iCocosLockView () @property (nonatomic, strong) NSMutableArray *selectedButtons; @property (nonatomic, assign) CGPoint currentMovePoint; @end
第一步:根据定义的那个选中按钮属性实现懒加载
- (NSMutableArray *)selectedButtons
{
if (_selectedButtons == nil) {
_selectedButtons = [NSMutableArray array];
}
return _selectedButtons;
}
第二部:为了方便拓展,使用代码的方式创建活着使用IB方式创建我们需要事项两个方法,并且在里面实现按钮的初始化
// 通过代码
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self setUp];
}
return self;
}
// 通过xib加载
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
[self setUp];
}
return self;
}
// 初始化实现
- (void)setUp
{
// 创建9个按钮
;i < kCount; i++) {
// 创建按钮
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.userInteractionEnabled = NO;
// 设置按钮默认的图片
[btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
// 设置按钮选中的图片
[btn setImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
btn.tag= i;
// 将btn添加到视图
[self addSubview:btn];
}
}
第三步:设置按钮的位置,因为在init方法中可能没有frame,在这里设置最准确
- (void)layoutSubviews
{
[super layoutSubviews];
// 设置按钮的位置
; i < self.subviews.count; i++) {
// 取出按钮
UIButton *btn = self.subviews[i];
// 设置位置
CGFloat w = ;
CGFloat h = ;
;
CGFloat col = i % totalCol;
CGFloat row = i / totalCol;
CGFloat margin = (self.bounds.size.width - totalCol * w) / (totalCol + );
CGFloat x = col * (margin + w) + margin;
CGFloat y = row * (margin + h);
btn.frame = CGRectMake(x, y, w, h);
}
}
第四步: 根据touches集合获取对应的触摸点位置
- (CGPoint)pointWithTouches:(NSSet *)touches
{
UITouch *touch = [touches anyObject];
CGPoint pos = [touch locationInView:self];
return pos;
}
第五步:根据不同的业务逻辑,划分功能,一个功能里面不要处理太多业务逻辑,以后开发就不好找了。
// 根据触摸点获得对应的按钮
- (UIButton *)buttonWithPoint:(CGPoint)point
{
; i < kCount; i++) {
UIButton *btn = self.subviews[i];
CGFloat wh = ;
CGPoint center = btn.center;
CGFloat x = center.x - wh * 0.5;
CGFloat y = center.y - wh * 0.5;
CGRect r = CGRectMake(x, y, wh, wh);
if (CGRectContainsPoint(btn.frame, point)) {
return btn;
}
}
// 都没有找到就返回Nil
return nil;
}
第六步:触摸开始
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
_currentMovePoint = CGPointMake(-, -);
// 1.获取触摸点
CGPoint pos =[self pointWithTouches:touches];
// 2.获取触摸的按钮
UIButton *btn = [self buttonWithPoint:pos];
// 3.设置状态
if (btn && btn.selected == NO) { // 摸到按钮
btn.selected = YES;
[self.selectedButtons addObject:btn];
}
[self setNeedsDisplay];
}
第七步:开始移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.获取触摸点
CGPoint pos =[self pointWithTouches:touches];
// 2.获取触摸的按钮
UIButton *btn = [self buttonWithPoint:pos];
// 3.设置状态
if (btn && btn.selected == NO) { // 摸到按钮
btn.selected = YES;
[self.selectedButtons addObject:btn];
}else{
_currentMovePoint = pos;
}
[self setNeedsDisplay];
}
第八步:开始触摸的时候获取位置
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
// 获取路径
NSMutableString *str = [NSMutableString string];
for (UIButton *b in _selectedButtons) {
[str appendFormat:@"%d",b.tag];
}
if ([_delegate respondsToSelector:@selector(lockView:didFinishPath:)]) {
[_delegate lockView:self didFinishPath:str];
}
// 全部取消选中
[self.selectedButtons makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];
// 清空数组
[self.selectedButtons removeAllObjects];
// 重绘
[self setNeedsDisplay];
}
第九步:绘制
- (void)drawRect:(CGRect)rect
{
// Drawing code
) return;
UIBezierPath *path = [UIBezierPath bezierPath];
; i < self.selectedButtons.count; i++) {
UIButton *b = _selectedButtons[i];
) {
[path moveToPoint:b.center];
}else{
[path addLineToPoint:b.center];
}
}
// 如果不是原点才需要画,但是有时候我们也需要画原点,怎么做,是不是可以搞个默认的初始值啊
// 注意啊,这个初始值不能在初始化里面搞,应该在触摸开始的时候设置
, -))) {
[path addLineToPoint:_currentMovePoint];
}
path.lineWidth = ;
// 设置线段样式
path.lineJoinStyle = kCGLineJoinBevel;
[[UIColor greenColor] set];
[path stroke];
}
@end
上面我们就实现了关于九宫格锁屏的疯转,下载使用起来就非常简单了,几行代码搞定:
#import "iCocosLockView.h"
@interface iCocosViewController ()<iCocosLockViewDelegate>
- (void)lockView:(iCocosLockView *)lockView didFinishPath:(NSString *)path
{
NSLog(@"拿到解锁路径---%@",path);
}
好了,一个很炫的九宫格解锁酒实现了,是不是很酷,,,,

iOS开发——使用技术OC篇&简单九宫格锁屏功能的实现与封装的更多相关文章
- iOS开发——高级技术OC篇&运行时(Runtime)机制
运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...
- iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍
UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据
网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...
- ios开发——实用技术篇OC篇&iOS的主要框架
iOS的主要框架 阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势
使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛 ...
- iOS开发——高级UI—OC篇&退出键盘
退出键盘 iOS开发中键盘的退出方法用很多中我们应该在合适的地方使用合适的方法才能更好的提高开发的效率和应用的性能 下面给大家介绍几种最常用的键盘退出方法,基本上iOS开发中的键盘退出方法都是这几种中 ...
- iOS开发——网络编程OC篇&(一)XMPP简单介绍与准备
XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈 ...
- iOS开发——新特性OC篇&IOS9 SDK新特性
iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...
随机推荐
- Request、Request.Form、Request.QueryString 用法的区别
Request.Form:获取以POST方式提交的数据. Request.QueryString:获取地址栏参数(以GET方式提交的数据). Request:包含以上两种方式(优先获取GET方式提交的 ...
- Winsock IO模型之select模型
之所以称其为select模型是因为它主要是使用select函数来管理I/O的.这个模型的设计源于UNIX系统,目的是允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字. int sele ...
- Hadoop学习记录(7)|Eclipse远程调试Hadoop
1.创建Hadoop项目 2.创建包.类 这里使用hdfs.WordCount为例 3.编写自定Mapper和Reducer程序 MyMapper类 static class MyMapper ext ...
- Hadoop概念学习系列之hadoop生态系统闲谈(二十五)
分层次讲解 最底层平台 ------->hdfs yarn mapreduce spark 应用层-------->hbase hive pig sparkSQL nu ...
- C++11外部模板
[C++11之外部模板] 在标准C++中,只要在编译单元内遇到被完整定义的模板,编译器都必须将其实例化(instantiate).这会大大增加编译时间,特别是模板在许多编译单元内使用相同的参数实例化. ...
- POJ 1269 Intersecting Lines(直线相交判断,求交点)
Intersecting Lines Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8342 Accepted: 378 ...
- 操作失败,没有该服务权限![ 机构号:99 ,用户ID:50000009 ,服务号:0101030112 ]
操作失败,没有该服务权限![ 机构号:99 ,用户ID:50000009 ,服务号:0101030112 ] 此时我们可以把代码 SERVICE_NO 改成 10个0 即 0000000000 ,就可 ...
- Leetcode226:Invert Binary Tree
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 /** * Definition for a ...
- Top 7 Myths about HTTPS
Myth #7 – HTTPS Never Caches People often claim that HTTPS content is never cached by the browser; p ...
- Oracle 分区字段数据更新
分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402:更新分区关键字列将导致分区的更改. 可以通过打开表的row movement属性来允许对分区 ...