简单九宫格锁屏功能的实现与封装

首先来看看最后的实现界面。

在这开始看下面的内容之前希望你能先大概思考活着回顾一下如果

你会怎么做,只要知道大概的思路就可以。

由于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篇&简单九宫格锁屏功能的实现与封装的更多相关文章

  1. iOS开发——高级技术OC篇&运行时(Runtime)机制

    运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...

  2. iOS开发——UI精选OC篇&UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

    UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍 一:UIApplication:单例(关于单例后面的文章中会详细介绍,你现在只要知道 ...

  3. iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据

    网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...

  4. ios开发——实用技术篇OC篇&iOS的主要框架

    iOS的主要框架         阅读目录 Foundation框架为所有的应用程序提供基本系统服务 UIKit框架提供创建基于触摸用户界面的类 Core Data框架管着理应用程序数据模型 Core ...

  5. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  6. iOS开发——运行时OC篇&使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

    使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛 ...

  7. iOS开发——高级UI—OC篇&退出键盘

    退出键盘 iOS开发中键盘的退出方法用很多中我们应该在合适的地方使用合适的方法才能更好的提高开发的效率和应用的性能 下面给大家介绍几种最常用的键盘退出方法,基本上iOS开发中的键盘退出方法都是这几种中 ...

  8. iOS开发——网络编程OC篇&(一)XMPP简单介绍与准备

    XMPP简单介绍与准备 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈 ...

  9. iOS开发——新特性OC篇&IOS9 SDK新特性

    iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...

随机推荐

  1. 解决android.os.NetworkOnMainThreadException

    好久不写Android代码手都生了,找出自己之前写的程序发现跑不了了,也没啥特别的错误提示,就看到一句有用的错误Caused by: android.os.NetworkOnMainThreadExc ...

  2. SQL和NOSQL有区别吗?

    在大数据高速发展的今天,数据量在不断的增加,传统的数据库可能不能满足人们的需求了,这个时候新霸哥注意到了NOSQL出现了可以解决这个问题.我们知道sql数据库可以存储数据和处理数据,但是NOSQL最大 ...

  3. MFC中GetPrivateProfileString相关函数

    项目中用到了这个函数,所以了解了一下,参考了一些博客: http://blog.sina.com.cn/s/blog_a599b5960101tsbk.html http://blog.csdn.ne ...

  4. (转载)OC学习篇之---协议的概念和用法

    在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...

  5. FlatBuffers与protobuf性能比较

    FlatBuffers发布时,顺便也公布了它的性能数据,具体数据请见Benchmark. 它的测试用例由以下数据构成"a set of about 10 objects containing ...

  6. Flex通信-Java服务端通信实例

    转自:http://blessht.iteye.com/blog/1132934Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言 ...

  7. 浅谈Spark(1) - Overview

    Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapReduce的是 ...

  8. openstack kilo 流量

  9. 在RHEL5.4下安装ORACLE11G

    以root身份登录到系统,新增组和用户: #groupadd oinstall #groupadd dba #useradd -g oinstall -G dba oracle #passwd ora ...

  10. jquery 回车切换 tab功能

    挺有趣的,Jquery 回车切换tab功能的实现哦 <html> <head><!--jquery库.js--></head> <body> ...