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内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...
随机推荐
- UI控件入门
其实整个学习过程.确实有点儿混乱,因为不懂的东西太多,一会儿看这,一会儿看那,马上就乱了. 还是先做点儿简单的事儿,说控件,但不会说完全,只是入个门,知道怎么学控件,具体要学好每一个控件需要项目中磨练 ...
- PHP 解压zip文件的函数封装
/** * zip文件解压 * * @param $zipFilePath zip文件的路径,可以不加zip文件后缀.如果其他类型的文件伪装成zip解压也会失败 * @param $directory ...
- c 按范围快速指定整数
以前用过octave, 和matlab类似的软件, 指定范围非常方便 i = 1:10:100; 就可以得到 10 20 30 ... 100 这一系列的数据, 但是在c里面, 必须手动写循环, 太 ...
- 黑马程序员——OC的内存管理学习小结
内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...
- PySpark操作HBase时设置scan参数
在用PySpark操作HBase时默认是scan操作,通常情况下我们希望加上rowkey指定范围,即只获取一部分数据参加运算.翻遍了spark的python相关文档,搜遍了google和stackov ...
- [cocos2d-js]按钮整合成大图后打APK后不显示
网页版本都能正常显示碎图和整合成大图的 手机版本不正常 var btnKick = cc.MenuItemImage.create( "#btn_kick.png", " ...
- 第三百零八至三百二十天 how can I 坚持
十三天..2月4号至2月16号,好快,假期还没开始就结束了.一一回忆下. 2月4号,腊月二十六,最后一天上班,没多大事,好像是玩了一天,东月回家,貌似路上好折腾,晚上D401,和她聊了一路,也聊了好多 ...
- 第二百一十二天 how can I 坚持
在家待了一天,过个周六日也就这样,时间.感觉好堕落. 下午心情特烦闷.好想结婚.为什么不认输,为什么会这样.这到底是一种什么心态. 哎.不懂自己. 睡觉. fordream.
- 转】MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码
原博文出自于:http://www.cnblogs.com/xdp-gacl/p/3496161.html 感谢! 在MyEclispe中创建Jsp页面,Jsp页面的默认编码是"ISO-88 ...
- MVC中过虑特殊字符检测
[ValidateInput(false)] [HttpPost] public ActionResult Modify(Models.BlogArticle model) { //...... } ...