2016-1-10 手勢解鎖demo的實現

一:實現自定義view,在.h,.m文件中代碼如下:

#import <UIKit/UIKit.h>
@class ZLLockView;
@protocol ZLLockViewDelegate <NSObject>
- (void)lockView:(ZLLockView *)lockView didSelectedPwd: (NSString *)pwd;
@end
@interface ZLLockView : UIView
@property (nonatomic, weak) id<ZLLockViewDelegate> delegate;@end
//
//  ZLLockView.m
//  手勢解鎖demo實現
//
//  Created by Mac on 16/1/9.
//  Copyright ? 2016年 Mac. All rights reserved.
//

#import "ZLLockView.h"
@interface ZLLockView()
@property (nonatomic, strong) NSMutableArray *btnsSelected;@property (nonatomic, assign) CGPoint lastPoint;@end
@implementation ZLLockView
- (NSMutableArray *)btnsSelected
{if (!_btnsSelected) {_btnsSelected = [NSMutableArray array];}return _btnsSelected;
}
- (instancetype)init
{if (self = [super init]) {[self setBtn];}return self;
}
- (void)setBtn
{for (int i = 0; i < 9; i ++) {UIButton *btn = [[UIButton alloc] init];btn.tag = i;[btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];[btn setImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];btn.userInteractionEnabled = NO;[self addSubview:btn];}
}// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {// Drawing codeUIBezierPath *path = [UIBezierPath bezierPath];path.lineWidth = 7;path.lineCapStyle = kCGLineCapRound;path.lineJoinStyle = kCGLineJoinRound;[[UIColor blueColor] set];NSInteger count = self.btnsSelected.count;if (count ==0)return;for (NSInteger i = 0; i < count; i ++) {UIButton *btn = self.btnsSelected[i];if (i == 0) {[path moveToPoint:btn.center];}else{[path addLineToPoint:btn.center];}}[path addLineToPoint:self.lastPoint];[path stroke];
}- (void)layoutSubviews
{CGFloat btnW = 74;CGFloat btnH = 74;
//    間距CGFloat padding = (self.frame.size.width - btnW * 3) / 4;NSInteger count = self.subviews.count;for (NSInteger i = 0; i < count; i ++) {UIButton *btn =  self.subviews[i];
//        當前按鈕所處的列NSInteger column = i % 3;
//        計算btn的x值CGFloat btnX = (column+1) * padding + column * btnW;
//        當前按鈕所處的行CGFloat row = i / 3;CGFloat btnY = (row+1) * padding + row * btnW;btn.frame = CGRectMake(btnX, btnY, btnW, btnH);}
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{[self touchesMoved:touches withEvent:event];
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//    獲取當前點UITouch *touch = [touches anyObject];CGPoint location =  [touch locationInView:touch.view];//    判斷在不在范圍內for (UIButton *btn  in self.subviews) {if (CGRectContainsPoint(btn.frame, location)) {//判斷獲得的點在不在范圍內//將選中的按鈕放在數組里if (btn.selected == NO) {[self.btnsSelected addObject:btn];}[btn setSelected:YES];}else self.lastPoint = location;}[self setNeedsDisplay];
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{NSMutableString *pwd = [NSMutableString string];for (UIButton *btn in self.btnsSelected) {[btn setSelected:NO];//拼接選中按鈕的索引[pwd appendFormat:@"%ld",btn.tag];[self setNeedsDisplay];}[self.btnsSelected removeAllObjects];NSLog(@"%@",pwd);[self.delegate lockView:self didSelectedPwd:pwd];
}
@end

二:在控制器中實現代理方法,代碼如下:

//
//  ViewController.m
//  手勢解鎖demo實現
//
//  Created by Mac on 16/1/9.
//  Copyright ? 2016年 Mac. All rights reserved.
//

#import "ViewController.h"
#import "ZLLockView.h"
#import "MBProgressHUD+CZ.h"
@interface ViewController ()<ZLLockViewDelegate>
@property (nonatomic, strong) ZLLockView *lockView;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Home_refresh_bg"]];// Do any additional setup after loading the view, typically from a nib.ZLLockView *lockView = [[ZLLockView alloc] init];CGFloat screenW = [UIScreen mainScreen].bounds.size.width;lockView.frame = CGRectMake(0, 0, screenW, screenW);lockView.center = self.view.center;lockView.backgroundColor = [UIColor clearColor];[self.view addSubview:lockView];self.lockView = lockView;lockView.delegate = self;}
- (void) lockView:(ZLLockView *)lockView didSelectedPwd:(NSString *)pwd
{if ([pwd isEqual:@"012345678"]) {[MBProgressHUD showMessage:@"密碼正確!"];[self.lockView removeFromSuperview];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[MBProgressHUD hideHUD];});}else{[MBProgressHUD showMessage:@"密碼錯誤!"];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[MBProgressHUD hideHUD];});}
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end

三:效果:

轉載于:https://www.cnblogs.com/BJTUzhengli/p/5117670.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373819.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373819.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373819.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php與JAVA的RSA加密互通

Java 版本RSA 進行加密解密 在網上查詢了好幾天&#xff0c;最終找到解決方案&#xff0c;網絡上都是通過Cipher.getInstance("RSA"); 而改成Cipher.getInstance("RSA/ECB/PKCS1Padding");就可以實現與php版本公鑰和密鑰互通了。 Cipher cipher Cipher.ge…

GWT入門

GWT是Google Web Development Kit的縮寫&#xff0c;可讓程序員使用Java開發Ajax Web應用程序。 GWT編譯器將Java代碼轉換為JavaScript和html代碼。 GWT應用程序稱為模塊&#xff0c;并且使用xml文件描述模塊&#xff0c;假定該模塊名稱為xml文件的“ mymodule”名稱為“ mymod…

JavaScript省市二級聯動

XML文件負責保存所需要的數據&#xff0c;而HTML文件負責通過javascript解析XML數據并顯示在頁面上。代碼如下&#xff1a; cities.xml <?xml version"1.0" encoding"GB2312"?> <china><province name"吉林省"><city>…

poj 3579 Median 二分套二分 或 二分加尺取

MedianTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5118 Accepted: 1641Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i &#xff1c; j ≤ N). We can get C(N,2)differenc…

qt 嵌入web頁面_Qt嵌入瀏覽器(三)——QWebEngine與Https

本篇簡介&#xff1a;本篇的小目標&#xff1a;挑戰通過Qt WebEngine實現與服務端的Https雙向認證雙向認證&#xff0c;Qt WebEngine和Chromium這里先說結論&#xff1a;挑戰失敗了。至少使用Qt WebEngine目前已實現的組件沒有辦法直接實現雙向認證。先來簡要分析一下實現雙向認…

python模塊;opencv安裝

http://www.lfd.uci.edu/~gohlke/pythonlibs/ 1. 步驟1. 下載Python2.73, 安裝, 并配置Python環境變量:".\Program Files\Python27;";注意: OpenCV僅支持2.6&2.7, Python不能使用3.x版本;2. 下載OpenCV2.46, 安裝, 并配置OpenCV環境變量:".\Program Files\o…

Java中的正則表達式–軟介紹

正則表達式是一種可以應用于文本&#xff08;Java中的String&#xff09;的模式。 Java提供了java.util.regex包&#xff0c;用于與正則表達式進行模式匹配。 Java正則表達式與Perl編程語言非常相似&#xff0c;并且非常易于學習。 正則表達式匹配文本&#xff08;或文本的一部…

AJAX入門——工作原理

理解同步交互和異步交互 舉個例子&#xff1a;普通B/S模式(同步) AJAX技術(異步) * 同步&#xff1a; 提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事。 發送方發出數據后&#xff0c;等接收方發回響應以后才發下一個數據包的…

Couldn’t communicate with a helper application.

出現此問題 的情景 我在提交svn之前&#xff0c;在Xcode中的Images.xcassets里添加了文件夾后又刪除了&#xff0c; 但是 在Xcode中提交的時候&#xff0c;左側勾選文件那一欄中 出現了此文件夾及里邊的文件。 解決&#xff1a; 我在conerstore中將此文件夾 remove后&#xff0…

python 復制文件夾內容 并結構一致_Python比較文件夾比另一同名文件夾多出的文件并復制出來的方法...

本文實例講述了Python比較文件夾比另一同名文件夾多出的文件并復制出來的方法。分享給大家供大家參考。具體如下&#xff1a;這個東東本來是做來給公司數據同步用的&#xff1a;新服務器還沒正式啟用&#xff0c;舊的服務器還在使用&#xff0c;每天都有大量圖片傳到舊服務器上…

css控制頁面文字不能被選中user-select:none;

現象&#xff1a;html中可能有些地方不想讓用戶復制文字&#xff0c;或是用a標簽做了個點擊按鈕&#xff0c;點快的時候文字會被選中&#xff0c;很丑&#xff0c;這個時候可以使用下面的方案禁止文字選中。原因&#xff1a;鼠標點快了文字會被選中。解決方案&#xff1a;不同的…

form表單標簽的enctype屬性的作用

Enctype是指定將數據回發到服務器時瀏覽器使用的編碼類型&#xff0c;其編碼類型有以下三種 一、 application/x-www-form-urlencoded 這是通過表單發送數據時默認的編碼類型。我們沒有在from標簽中設置enctype屬性時默認就是application/x-www-form-urlencoded類型的。…

重溫“ Java Sucks”

總覽 關于Java的不足之處&#xff08;從C開發人員的角度來看&#xff09;的一個有趣的文檔是在一段時間&#xff08;大約2000年前&#xff09;寫的&#xff0c;但是今天許多論點都像十年前一樣真實&#xff08;或不真實&#xff09;。 原始的Java Sucks發布。 短消息回顧 Ja…

Android Studio IDE Out of Memory

場景&#xff1a; 嘗試過各種方式&#xff0c;IDE重裝&#xff0c;重新啟動&#xff0c;設置IDE MEMORY大小JDK MEMORY大小都無效 終于在FILE->INVALIDATE CACHES/RESTART 中點擊重新啟動之后問題攻克了。轉載于:https://www.cnblogs.com/yxwkf/p/5128094.html

git 忽略 部分文件夾_git設置忽略文件和目錄

1.登錄gitbash命令端進入本地git庫目錄AdministratorPC201601200946 MINGW32 /d/gitrespository/crmweb (master)2.創建.gitignore3.修改文件&#xff0c;添加忽略正則.idea //忽略.idea文件夾及文件夾下文件*.iml //忽略以.iml結尾的文件【例子】# 忽略*.o和*.a文件*.[oa]# 忽…

在Spring MVC REST應用程序中自動生成WADL

上一次我們學習了WADL的基礎知識 。 語言本身并沒有那么有趣&#xff0c;只寫了一篇有關它的文章&#xff0c;但是本文的標題揭示了為什么我們需要這些知識。 JSR 311的許多實現&#xff1a;JAX-RS&#xff1a;RESTful Web服務的Java API提供了開箱即用的運行時WADL生成&#x…

JSP靜態導入與動態導入

JSP靜態導入&#xff08;JSP指令標記include&#xff09; JSP頁面第一次被請求時&#xff0c;會被JSP引擎轉譯成Servlet的Java文件&#xff0c;然后再被編譯成字節碼文件執行。JSP指令標記為JSP頁面轉譯提供整個頁面的相關信息。 include指令用于在JSP頁面靜態插入一個文件&…

關于DJANGO和JAVASCRIPT的時間

最近&#xff0c;實際一些簡單統計時&#xff0c;要到庫里去檢索數據出來用HIGHCHARTS畫圖&#xff0c; 作一個簡單的回照。。 DJANGO用TEMPLATEVIEW來作。專業&#xff0c;正規&#xff1a;&#xff09; class SAView(TemplateView):template_name version/sa_site.htmlpagin…

git里面的文件怎么刪不掉_.git目錄刪不掉

這樣的情況并非是第一次遇到了&#xff0c;以前總是會覺得這樣的問題只是電腦的錯亂&#xff0c;重啟一下電腦就好了&#xff0c;但是并非每次都需要重啟電腦的&#xff0c;其實簡單的設置一下&#xff0c;這個問題就可以解決了。對了&#xff0c;咱們還是說說這到底是個什么問…

集成框架比較– Spring集成,Mule ESB或Apache Camel

公司之間的數據交換增加了很多。 必須集成的應用程序數量也增加了。 這些接口使用不同的技術&#xff0c;協議和數據格式。 但是&#xff0c;這些應用程序的集成應以標準化的方式建模&#xff0c;有效實現并由自動測試支持 。 JVM環境中提供了三個可滿足這些要求的集成框架&…