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

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

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

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

由于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. 【LeetCode】231 - Power of Two

    Given an integer, write a function to determine if it is a power of two. Solution:一个整数如果是2的整数次方,那么它的 ...

  2. C语言实现strcmp

    注意转化为unsigned char: strcmp.h #ifndef STRCMP_H #define STRCMP_H /************************************ ...

  3. Redis批量导入数据

    首先准备数据文件 格式为 SET Key0 Value0 SET Key1 Value1 ... SET KeyN ValueN 利用shell转换数据 #!/bin/bash while read ...

  4. Linux下如何进行FTP设置

    一.Redhat/CentOS安装vsftp软件 1.更新yum源 首先需要更新系统的yum源,便捷工具下载地址:http://help.aliyun.com/manual?spm=0.0.0.0.z ...

  5. mongodb使用中遇到的问题汇总

    1. 每次重新打开mongo,都会显示:forked process:xxxx ,然后用 find -name mongod.lock 进行搜索,发现在 ./var/lib/mongodb/ 目录下又 ...

  6. Eclipse配置信息

    1.Eclipse VM arguments的保存位置: .metadata\.plugins\org.eclipse.debug.core\.launches (使用文件比较工具找出配置信息的保存位 ...

  7. MVC如何配置才能访问静态页面

    默认在Views文件外的静态页面可以访问,若要访问Views里的静态页面则需要修改View文件夹中的web.config: <system.webServer> <handlers& ...

  8. 借助LVS+Keepalived实现负载均衡(转)

    原文:http://www.cnblogs.com/edisonchou/p/4281978.html 一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务 ...

  9. Dependency Injection学习笔记

    component把需要依赖者(CoffeeMaker)和供应提供者(Heater, Pump)联系起来 使用 区别:上的的依赖是内部创建的,下面的依赖是外面传进来的 注入方式

  10. java getEnv不区分大小写 getProperty区分大小写

    System.out.println(System.getenv("JAVA_HOME")); System.out.println(System.getenv("Pat ...