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

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

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

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

由于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. Mac OS10.9 下python开发环境(eclipse)以及自然语言包NLTK的安装与注意

    折腾了大半天,终于把mbp上python自然语言开发环境搭建好了. 第一步,安装JDK1.7 for mac MacOS10.9是自带python2.7.5的,够用,具体的可以打开终端输入python ...

  2. 现代浏览器内置的可等效替代jQuery的功能

    jQuery的体积在不断的增大.新功能要不断增加,这是必然结果.虽然从版本1.8.3开始的瘦身效果明显,但不可否认的是,对于移动手机端的网 页开发,它仍然是不可接受的.当然,jQuery不是铁板一块, ...

  3. iOS App中数据加载的6种方式

    我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以 ...

  4. public static void main(String arg[])

      该语句定义了main方法. main方法是程序执行的入口,所有的java程序都必须具备一个main()方法,而且必须按照如上的格式来定义. 不具有main方法的类可以编译,但不能执行.因为它没有m ...

  5. 预定义宏_GNUC_ _MSC_VER

    一.预定义__GNUC__宏 1 __GNUC__ 是gcc编译器编译代码时预定义的一个宏.需要针对gcc编写代码时, 可以使用该宏进行条件编译. 2 __GNUC__ 的值表示gcc的版本.需要针对 ...

  6. 《Java数据结构与算法》笔记-CH4-6栈结构实现中缀转后缀

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

  7. webrtc--AudioProcessing的使用

    1.AudioProcessing的实例化和配置: AudioProcessing* apm = AudioProcessing::Create(0); apm->level_estimator ...

  8. Tagged Pointers

    [Tagged Pointers] 1.what is tagged pointer? 2.原理剖析

  9. unigui MessageDlg方法调用例子

    procedure TfrmEmployee.btnDeleteClick(Sender: TObject);var aBool: Boolean;begin inherited; MessageDl ...

  10. 开发资源列表【Worldsing分享】

      ucGUI(emWin)类: ucGui 汉字库生成(汉字库提取工具):ucGuiFont点击下载 ucGui v3.98 VC模拟工程源代码(VS2008):ucGUI3.98 VS2008 点 ...