iOS開發小功能之八:手勢的簡單使用(6種)以及代理方法

来源:http://www.cnblogs.com/hissia/archive/2016/05/01/5451216.html
-Advertisement-
Play Games

代碼: 代理方法: ...


註意:全部都是在UIView上操作手勢

代碼:

  1 #import "ViewController.h"
  2 @interface ViewController () <UIGestureRecognizerDelegate>
  4 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
  5 @end
  7 @implementation ViewController
  8 - (void)viewDidLoad {
  9     [super viewDidLoad];
 10     //只要是手勢,預設都是相對於原來位置,且預設控制只支持一個手勢!!若想支持多個手勢,詳見下麵的代理方法
 11 //    [self setUpRotation];
 12 //    [self setUpPinch];
 13     [self setUpPan];
 14 }
 15 
 16 #pragma mark - 點按手勢
 17 - (void)setUpTap
 18 {
 19     //創建點按手勢
 20     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
 21     //需要連續點3次才能觸發
 22     //    tap.numberOfTapsRequired = 3;
 23     //往imageView上添加點按手勢
 24     [self.imageView addGestureRecognizer:tap];
 25     //設置點按手勢代理
 26     tap.delegate = self;
 27 }
 28 
 29 - (void)tap:(UITapGestureRecognizer *)tap
 30 {
 31     NSLog(@"%s",__func__);
 32 }
 33 
 34 #pragma mark - 長按手勢
 35 //預設觸發兩次(開始觸摸半秒後一次,結束觸摸一次)
 36 - (void)setUpLongPress
 37 {
 38     UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
 39     [self.imageView addGestureRecognizer:longPress];
 40     longPress.delegate = self;
 41 }
 42 
 43 - (void)longPress:(UILongPressGestureRecognizer *)longPress
 44 {
 45     開始的時候觸摸
 46     if (longPress.state == UIGestureRecognizerStateBegan) {
 47        NSLog(@"%s",__func__);
 48     }
 49     結束的時候觸摸
 50     if (longPress.state == UIGestureRecognizerStateEnded) {
 51         NSLog(@"%s",__func__);
 52     }
 53 }
 54 
 55 #pragma mark - 輕掃手勢
 56 - (void)setUpSwipe
 57 {
 58     //預設輕掃手勢往右劃屏幕
 59     UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
 60     //向上劃
 61     swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
 62     [_imageView addGestureRecognizer:swipeUp];
 63     //一個清掃手勢只支持一個方向,如果想支持多個方向,必須創建多個
 64     UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
 65     //向下劃
 66     swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
 67     [_imageView addGestureRecognizer:swipeDown];
 68 }
 69 - (void)swipe:(UISwipeGestureRecognizer *)swipe
 70 {
 71     NSLog(@"%s",__func__);
 72 }
 73 
 74 #pragma mark - 旋轉手勢
 75 //預設傳遞的角度都相對於最開始的位置
 76 - (void)setUpRotation
 77 {
 78     UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
 79     rotation.delegate = self;
 80     [self.imageView addGestureRecognizer:rotation];
 81 }
 82 - (void)rotation:(UIRotationGestureRecognizer *)rotation
 83 {
 84     //讓圖片隨著手勢旋轉而旋轉,旋轉的角度相當於初始位置的值,配合rotation.rotation = 0;無法轉動
 85 //    self.imageView.transform = CGAffineTransformMakeRotation(rotation.rotation);
 86     //手勢旋轉一下能讓圖片高速旋轉N圈,並且不受控制,方向不容易確定。配合rotation.rotation = 0;後角度一直為0
 87     self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotation.rotation);   
 88     //複位
 89     rotation.rotation = 0;
 90     //獲取手勢旋轉的角度
 91     NSLog(@"%f",rotation.rotation);
 92 }
 93 
 94 #pragma mark - 捏合手勢
 95 //兩根手指放大縮小圖片
 96 - (void)setUpPinch
 97 {
 98     UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
 99     pinch.delegate = self;
100     [self.imageView addGestureRecognizer:pinch];
101 }
102 - (void)pinch:(UIPinchGestureRecognizer *)pinch
103 {
104     //放大的比例相對於原始點,註意:這個不能配合pinch.scale = 1使用,否則不能放大
105 //    self.imageView.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale);
106     //隨著兩手指的距離增大,圖片會無規則的迅速的放大或者縮小(此處無法控制放大還是縮小),註意:配合pinch.scale = 1使用會正常的放大和縮小
107     self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinch.scale, pinch.scale);
108     //複位
109     pinch.scale = 1;
110     NSLog(@"%f",pinch.scale);
111 }
112 
113 #pragma mark - 拖拽
114 //移動視圖
115 - (void)setUpPan
116 {
117     UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
118     [self.imageView addGestureRecognizer:pan];
119 }
120 - (void)pan:(UIPanGestureRecognizer *)pan
121 {
122     //獲取手勢的移動,相對於原始點
123     CGPoint transP = [pan translationInView:self.imageView];
124     self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, transP.x, transP.y);
125     //複位
126     [pan setTranslation:CGPointZero inView:self.imageView];
127     NSLog(@"%@",NSStringFromCGPoint(transP));
128 }
129 @end

代理方法:

 1 是否允許同時支持多個手勢,預設只支持一個手勢,要調用此方法註意設置代理
 2 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
 3 {
 4     return YES;
 5 }
 6 
 7 是否允許開始觸發手勢
 8 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
 9 {
10     return NO;
11 }
12 
13 是否允許接收手機的觸摸(可以控制觸摸的範圍)
14 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
15 {
16     //獲取當前的觸摸點
17     CGPoint currentP = [touch locationInView:self.imageView];
18       在圖片的左半區域可以接受觸摸
19     if (currentP.x < self.imageView.bounds.size.width * 0.5) {
20         return YES;
21     }else {
22         return NO;
23     }
24 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 列表組可以用來製作列表清單、垂直導航等效果,也可以配合其他的組件製作出更漂亮的組件,列表組在bootstrap框架中也是一個獨立的組件,所以也對應有自己獨立源碼: LESS:list-group.less SASS:_list-group.scss 列表組看上去就是去掉了列表符號的列表項,並且配上一... ...
  • 學習要點: 1.佈局模型 2.表格佈局 3.浮動佈局 主講教師:李炎恢 本章主要探討 HTML5 中 CSS 早期所使用的傳統佈局,很多情況下,這些佈局方式還是非常有用的。 一.佈局模型 在早期沒有平板和智能手機等移動設備大行其道的時期,Web 頁面的設計主要是面向 PC 端電腦解析度展開的。這種分 ...
  • 學習要點: 1.動畫簡介 2.屬性詳解 3.簡寫和版本 主講教師:李炎恢 本章主要探討 HTML5 中 CSS3 的動畫效果,可以通過類似 Flash 那樣的關鍵幀模式控制運行。 一.動畫簡介 CSS3 提供了類似 Flash 關鍵幀控制的動畫效果,通過 animation 屬性實現。那麼之前的 t ...
  • 學習要點: 1.過渡簡介 2.transition-property 3.transition-duration 4.transition-timing-function 5.transition-delay 6.簡寫和版本 主講教師:李炎恢 本章主要探討 HTML5 中 CSS3 的過渡效果,通過 ...
  • 學習要點: 1.屬性初探 2.屬性解釋 3.簡寫和版本 主講教師:李炎恢 本章主要探討 HTML5 中 CSS3 中邊框圖片背景的效果,通過這個新屬性讓邊框更加的豐富多彩。 一.屬性解釋 CSS3 提供了一個新的屬性集合,用這幾個屬性可以嵌入圖片形式的邊框。這樣,邊框就可以自定義了。 學習要點: 1 ...
  • Markdown Notepad 如果給大家介紹一個Markdown編輯器不有什麼特點或差異, 真沒必要在這裡給大家推薦. 開始使用Markdown Notepad跟其他同品不一樣的地方在於: 多標簽可以同時打開多個文件、編輯和預覽 自動保存與恢復無需手工保存,即便關閉甚至終止瀏覽器也不會丟失數據 ...
  • 學習要點: 1.線性漸變 2.徑向漸變 主講教師:李炎恢 本章主要探討 HTML5 中 CSS3 背景漸變功能,主要有兩種漸變方式:線性漸變和徑向(放射性)漸變。 一.線性漸變 CSS3 提供了 linear-gradient 屬性實現背景顏色的漸變功能。在以前,這種效果必須採用圖片才能實現的。首先 ...
  • 學習要點: 1.文本陰影 2.文本裁剪 3.文本描邊 4.文本填充 主講教師:李炎恢 本章主要探討 HTML5 中 CSS3 中文本效果,其中也包含一些之前講過的 CSS3 文本屬性。 一.文本陰影 CSS3 提供了 text-shadow 文本陰影效果,這個屬性在之前講過,只是沒有涉及瀏覽器支持情 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...