iOS实战:传感器卷(Swift版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-19 20:05:52

点击下载

作者:关东升

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

iOS实战:传感器卷(Swift版)

iOS实战:传感器卷(Swift版)试读:

内容简介

本书系统论述了iOS传感器应用开发的相关知识,全部采用最新的基于iOS 8的API。全书分为9章:第1章介绍开发准备工作、本书结构及书中的一些约定;第2章介绍手势识别,通过两种方式实现iOS常用手势,包括Tap(单击)、Long Press(长按)、Pan(拖动)、Swipe(滑动)、Rotation(旋转)和Pinch(手指的合拢和张开);第3章介绍加速度计与陀螺仪,通过这两种可以感知设备运动状态的传感器,可以开发出很多有趣的应用和游戏;第4章介绍指南针与磁力计,磁力计可以感知周围的磁场,可以开发指南针、罗盘等导航应用,还可以开发特斯拉计(或高斯计)等感知磁场强度的应用;第5章介绍照相机与摄像头,包括图片抓取、视频捕获等技术;第6章介绍音频设备访问,重点介绍了使用AVFoundation框架实现音频播放和音频录制;第7章介绍使用蓝牙,重点介绍了低功耗蓝牙、Game Kit和蓝牙通信;第8章介绍定位技术,包括定位服务编程、地理信息编码、地理信息反编码、微定位技术iBeacon和接近传感器;第9章是项目实战,通过增强现实版本铅锤应用介绍iOS敏捷开发过程,本项目中综合用到了视频捕获实现的增强现实技术、加速度计等传感器。前言PREFACE

在iOS应用开发中,有很多内容涉及硬件访问和传感器编程。本书将向读者系统介绍iOS设备的传感器应用开发。由于苹果公司推出了iOS开发的新语言——Swift;而我们智捷课堂团队以前编写的一系列iOS经典图书,也都需要升级为Swift语言版本以满足开发者需求,基于这样的背景,我们智捷课堂与清华大学出版社联合策划了5本有关iOS开发的图书:《iOS实战:入门与提高卷(Swift版)》《iOS实战:图形图像、动画与多媒体卷(Swift版)》

● 《iOS实战:传感器卷(Swift版)》

● 《iOS实战:苹果“生态圈”编程卷(Swift版)》

● 《iOS实战:Apple Watch卷(Swift版)》

有关“iOS开发实战”系列图书的具体进展,请读者关注智捷课堂官方网站http://www.51work6.com。

本书网站

为了更好地为广大读者提供服务,我们专门为本书建立了一个网站http://www.51work6.com/ios4.php,读者可以查看相关出版进度,并对书中内容发表评论,提出宝贵意见。

源代码

书中提供了100多个完整的项目案例源代码,全部采用最新的iOS 8 API和操作界面,读者可以到本书网站http://www.51work6.com/ios4.php下载。

勘误与支持

我们在本书网站http://www.51work6.com/ios4. php中建立了一个勘误专区,及时地把书中的错误、纰漏和修正方案反馈给广大读者。如果读者在学习过程中,发现了什么问题,可以在网上留言,也可以发送电子邮件到eorient@sina.com,我们会在第一时间回复您。读者也可以在新浪微博(@tony_关东升)或微信(tony关东升)中与我们联系。

本书主要由关东升执笔撰写。此外,智捷课堂团队的贾云龙、赵大羽、赵志荣、李玉超、关珊和李政刚也参与了本书部分内容的编写工作。感谢清华大学出版社的盛东亮编辑给我们提供了宝贵的意见。感谢赵大羽老师手绘了书中全部草图,并从专业的角度修改书中图片,力求更加真实完美地呈现给广大读者。感谢我的家人对我的理解和支持,使我能投入全部精力,专心编写此书。

由于时间仓促,书中难免存在不妥之处,请读者谅解并提出宝贵意见。2015年5月于北京第1章 准备开始

移动设备与PC不同之处很多,其中移动设备有很多传感器,这些传感器可以开发很多有意思的应用。可以使用麦克风获取音频,开发出一个测量风速的应用。也可以使用GPS定位开发出导航应用。本书将介绍苹果iOS设备主要的传感器应用开发。1.1 本书结构

本书介绍苹果iOS设备主要的传感器应用开发的相关知识,其中包括手势识别、加速度计、陀螺仪、指南针、磁力计、照相机、摄像头、音频设备访问、定位和蓝牙通信等。

全书包括内容:

(1)iOS中的手势识别,包括手势识别的种类、如何使用手势识别器以及手势识别与事件触发。

(2)加速度计与陀螺仪的技术,涵盖加速度计与陀螺仪的访问与设备感知、设备检测。

(3)指南针与磁力计,介绍了访问磁力计的API与检测磁场的API,并通过指南针应用和特斯拉计应用详细讲解这两个传感器的使用。

(4)照相机与摄像头,包括照片的捕捉与处理以及视频捕获的两种方式。

(5)音频设备访问,首先介绍了音频设备,然后详细介绍了音频API,最后介绍了音频的播放与录制。

(6)定位,包括定位的API、距离过滤器、精度定位以及地理信息反编码与编码查询。

(7)蓝牙通信,主要介绍了低耗能蓝牙技术。

(8)增强现实版的铅锤应用,总体介绍了iOS传感器实战开发技巧和iOS项目敏捷开发过程。1.2 本书中的约定

为了方便使用本书,本节介绍一下本书中实例代码和图示的相关约定。1.2.1 实例代码约定

本书作为一本介绍编程方面的书,书中有很多实例代码。下载本书代码并解压代码,会看到图1-1所示的目录结构。图1-1 本书实例目录结构

目录ch2~ch9代表第2章~第9章的实例代码或一些资源文件,其中工程或工作空间的命名有以下几种形式:

(1)二级目录标号,如8.1 My Location说明是第8章第8.1节中使用的My Location工程实例。

(2)三级目录标号,如5.2.2 Take Picture说明是第5章第5.2.2节中使用的Take Picture工程实例。

(3)没有标号情况下,由所在父目录说明是哪个章节的实例工程,如PlumbBob说明是在第9章中使用的。1.2.2 图示约定

为了更形象有效地说明知识点或描述操作,本书添加了很多图示。下面对图示中的一些符号含义进行简要说明。1.图中的圈框

有时会看到图1-2所示的圈框,圈框中的内容是选中的内容或重点要说明的内容、需要引起注意的内容。图1-2 图中圈框2.图中的箭头

如图1-3~图1-5所示,箭头用于说明用户的动作,一般箭尾是动作开始的地方,箭头指向动作结束的地方。图1-3使用实线箭头表示选中控件修改属性。图1-4使用虚线箭头表示操作。图1-5所示箭头代表界面的跳转。图1-3 图中箭头1图1-4 图中箭头2图1-5 图中箭头3

上述内容包含本书使用的大部分符号,一些个别符号会在使用时具体说明。1.2.3 方法命名约定

苹果在官方文档中采用Objective-C多重参数描述API,它将方法名按照参数的个数分成几个部分。

提示:关于Objective-C多重参数,下面的代码实现了在一个集合中按照索引插入元素。 -(void) insertObject:(id) anObject atlndex:(NSInteger) index

图1-6所示说明了Objective-C多重参数方法定义,第一个参数是anObject,参数类型是id类型,第二个参数是index,参数类型是NSUInteger,这叫作多重参数。它的返回类型是void,方法签名是insertObject:atlndex:。方法类型标识符中用“-”表示方法是实例方法,“+”表示方法是类方法,关于实例方法和类方法我们将在后面内容中讨论。如果上面的方法变成C或C++形式,则是下面的样子:图1-6 Objective-C多重参数方法定义 void insertObjectAtIndex( id anObject, NSUInteger index)

苹果公司在推出Swift语言后,仍然采用多重参数描述API,如图1-7所示苹果API文档。图1-7 苹果API文档

图1-7所示是UITableView类的-numberOfRowsInSection:方法,其中“-”表示实例方法,“+”表示静态方法,“:”表示后面有参数。

该方法表示成Swift语言是如下方法: func numberOfRowsInSection( section:Int) - >Int

该方法表示成Objective-C语言是如下方法: -(NSInteger)numberOfRowsInSection:(NSInteger) section

为了统一命名我们也采用苹果官方的提法,即在本书中提到Swift方法时也采用-numberOfRowsInSection:多重参数形式,特殊情况下我们会加以说明。1.2.4 构造器命名约定

构造器是特殊的方法,它也采用Objective-C多重参数描述API,但是更为特殊,例如:UITableView的构造器是“-initWithFrame:style:”,如图1-8所示。图1-8 苹果构造器API

该构造器表示成Swift语言形式如下: init(frame frame: CGRect,style style: UITableViewStyle)

该构造器表示成Objective-C语言是如下方法: -(instancetype) initWithFrame:(CGRect) frame style:(UITableViewStyle) style

为了统一命名我们也采用苹果官方的提法,即在本书中提到Swift构造器时也采用-initWithFrame:style:多重参数形式,特殊情况下我们会加以说明。第2章 手势识别“手势是指人类用语言中枢建立起来的一套用手掌和手指位置、形状的特定语言系统。其中包括通用的,如聋哑人使用的手语。还有在特定情况下的该种系统,如海军陆战队。”——引自于维基百科http://zh.wikipedia.org/wiki/手势。

电子触屏设备上的手势是用户与设备进行交流的特定语言。作为设备能够识别这些手势,而且要能够为开发人员提供开发接口。2.1 手势种类

在iOS设备上有极其丰富的手势,理论上说手势的种类是没有限制的,可以开发出很多诡异的手势,但是用户是否会用得好就不得而知了。因此手势种类一般都是比较熟悉的几种。

在iOS设备中常用的手势有Tap(单击)、Long Press(长按)、Pan(平移)、Swipe(滑动)、Rotation(旋转)、Pinch(手指的合拢和张开)和Screen Edge Pan(屏幕边缘平移)等。这些手势如表2-1所示。表2-1 iOS设备手势续表2.2 使用手势识别器

在iOS设备上识别手势有两种实现方式:采用手势识别器(UIGestureRecognizer)和采用触摸事件(UITouch)识别。本节介绍采用手势识别器实现手势识别。

手势识别器类UIGestureRecognizer是一个抽象类,它有7个具体实现类:UITapGestureRecognizer、UIPinchGestureRecognizer、UIRotationGestureRecognizer、UISwipeGestureRecognizer、UIPanGestureRecognizer、UILongPressGestureRecognizer、UIScreenEdgePanGestureRecognizer。

从上面这几个类的命名可以看出与表2-1介绍的7种手势对应关系,如果这7种手势识别器不能满足要求,还可以直接继承UIGestureRecognizer实现自己的特殊手势识别。2.2.1 视图对象与手势识别

手势识别一定是发生在某一个视图对象上的,它可能是常用标签、按钮、图片等视图或者控件。要对视图对象进行手势识别,需要使用下面的语句添加手势识别器: self, view, addGestureRecognizer( gestureRecognizer)

其中,gestureRecognizer是具体的手势识别器对象。

此外,针对视图对象还需要设置一些属性。主要有两个属性:

(1)userInteractionEnabled——开启或关闭用户事件。

(2)multipleTouchEnabled——设置是否接收多点触摸事件。

可以在程序代码中设置这两个属性,它们的设置通常是在视图控制器的viewDidLoad方法中完成的。实例代码如下: override func viewDidLoad() { self.view,multipleTouchEnabled= false self.view,userInteractionEnabled= true ... }

当然,也可以在Interface Builder中通过设计视图属性实现。在Interface Builder中选中要设置的视图对象。如图2-1所示,打开属性检查器,在View→Interaction属性中设置这两个属性。图2-1 设置视图属性2.2.2 手势识别状态

UIGestureRecognizer类有一个state属性,它用来表示手势识别过程中的状态。手势识别的状态分为7个,这些状态是在UIGestureRecognizerState枚举类型中定义的成员:

(1).Possible——手势尚未识别,它是默认状态。

(2).Began——开始接收连续类型手势。

(3).Changed——接收连续类型手势状态变化。

(4).Ended——结束接收连续类型手势。

(5).Cancelled——取消接收连续类型手势。

(6).Failed——离散类型的手势识别失败。

手势分为连续类型的手势与离散类型的手势。连续类型的手势,如Pinch(手指的合拢和张开),它的整个过程中连续产生多个触摸点,它的识别过程如图2-2所示,其中Changed状态可能会多次变化,最后有Ended(结束)和Cancelled(取消)两种状态。离散类型手势,只发生一次,如Tap(单击)手势,如图2-3所示,识别过程只有两种状态:结束(Ended)和失败(Failed)。图2-2 连续类型手势识别过程图2-3 离散类型手势识别过程2.2.3 检测Tap(单击)

检测Tap(单击)使用的手势识别器是UITapGestureRecognizer。使用UITapGestureRecognizer实现单击检测有两种方式:一种是通过代码编程实现;另一种是在Interface Builder中进行设计实现。

下面通过一个实例介绍一下UITapGestureRecognizer的使用。这个实例如图2-4(a)所示,在屏幕上有一个装满的垃圾桶,单击它倾倒垃圾,如图2-4(b)所示。再单击又装满,反复变换。图2-4 Tap手势识别实例

下面分别介绍两种不同的使用方法。1.通过代码编程实现

这个实现过程的具体步骤是,首先来创建一个TapGestureRecognizer工程,本书采用Xcode 6工具,启动Xcode,选择File→New→Project命令,在打开的Choose a template for your new project对话框中,选择Single View Application工程模板,如图2-5所示。图2-5 选择工程模板

然后单击Next按钮,随即出现图2-6所示的对话框。在Product Name文本框中输入TapGestureRecognizer,它是工程名字。设置完相关的工程选项后,单击Next按钮,进入下一级界面。根据提示选择存放文件的位置对话框,然后单击Create按钮创建工程。图2-6 新工程中的选项

工程创建完成后,还需要将图片等资源文件(Blend Trash Empty, png和Blend Trash Full, png)导入工程中。然后看看UI设计工作,打开故事板文件,从对象库中拖曳Image View到设计窗口,然后修改它的位置和大小。

作为能够接收用户事件的视图对象,需要设置它的UserInteractionEnabled为开启。具体步骤是选择Image View,打开属性检查器,如图2-7所示,找到View—Interaction属性,选中User Interaction Enabled复选框。图2-7 设置Image View的User Interaction Enabled属性

基本的UI设计完成之后,还需要为Image View定义输出口,为按钮定义动作事件。单击左上角第一组按钮中的“打开辅助编辑器”按钮。选中Image View,同时按住Control键,将Image View拖曳到右边窗口,如图2-8所示。图2-8 拖曳Image View

放开左键会弹出一个对话框。在Connection栏选择Outlet,将Name命名为imageView,如图2-9所示。图2-9 输出口对话框

单击Connect按钮,右边的编辑界面将自动添加如下一行代码: @IBOutlet weak var imageView:UIImageView!

下面看看核心代码。打开工程TapGestureRecognizer代码中的ViewController. swift文件,声明相关代码如下所示: import UIKit class ViewController: UIViewController { var boolTrashEmptyFlag=false//垃圾桶空标志false桶满,true桶空 var imageTrashFull:UIImage! var imageTrashEmpty:UIImage! @IBOutlet weak var imageView:UIImageView! ... }

上述代码中boolTrashEmptyFlag变量用来标志垃圾桶空还是装满,imageTrashFull和imageTrashEmpty属性用来保存两张垃圾桶图片。此外,还定义了具有输出口的UIImageView控件属性imageView。

打开工程TapGestureRecognizer代码中的ViewController. swift,主要代码如下所示: override func viewDidLoad() { super,viewDidLoad() let bundle=NSBundle. mainBundle() let imageTrashFullPath= bundle. pathForResource("Blend Trash Full", ofType: "png") ① let imageTrashEmptyPath=bundle. pathForResource( "Blend Trash Empty", ofType: "png") ② self.imageTrashFull=UIImage(contentsOfFile: imageTrashFullPath!) self.imageTrashEmpty=UIImage(contentsOfFile: imageTrashEmptyPath!) self.imageView, image=self.imageTrashFull let tapRecognizer= UITapGestureRecognizer(target: self, action: "foundTap:“) ③ tapRecognizer,numberOfTapsRequired=1 ④ tapRecognizer,numberOfTouchesRequired=1 ⑤ self.imageView, addGestureRecognizer(tapRecognizer) ⑥ } func foundTap(paramSender:UITapGestureRecognizer){ ⑦ NSLog("tap") if boolTrashEmptyFlag{ ⑧ self.imageView,image= self.imageTrashFull boolTrashEmptyFlag= false } else{ self.imageView,image=self.imageTrashEmpty boolTrashEmptyFlag= true } }

在viewDidLoad方法中初始化视图和手势识别器。其中第①和②行代码是创建两个图片对象。

第③行代码是实例化手势识别器UITapGestureRecognizer,使用构造器initWithTarget:action:,在该方法中target参数是指定回调方法所在目标对象,action参数用来设置手势识别后回调的方法。

第④行代码tapRecognizer. numberOfTapsRequired=1设置触发Tap的单击次数,1就是单击一下触发,如果是2就是双击。

第⑤行代码tapRecognizer. numberOfTouchesRequired=1设置触发Tap的触点个数,即有几个手指按在屏幕上。

第⑥行代码self. imageView. addGestureRecognizer(tapRecognizer)是将手势识别器对象添加到图片视图对象上。

第⑦行代码foundTap:方法是在创建手势识别对象时指定回调方法。这个方法可以带有参数也可以没有参数,形式如下: func foundTap()

没有参数情况下创建手势识别对象代码有一点区别。代码如下: UITapGestureRecognizer(target:self, action:”foundTap”)

方法名foundTap要省去冒号。

第⑧行代码判断语句就是进行图片的切换处理。2.在Interface Builder中进行设计实现

首先参考上面的做法创建工程,并打开故事板文件Main, storyboard,在设计界面上添加Image View控件,摆放好位置,连接好输出口。然后,在Interface Builder中为Image View添加Tap手势识别器。在Interface Builder的对象库中有7个手势识别器,如图2-10所示,这7个手势识别器对应表2-1中的7个手势。图2-10 手势识别器对象

具体使用的时候拖曳手势识别器对象到设计窗口中的视图对象上。如图2-11所示,拖曳Tap Gesture Recognizer对象到Image View上,注意不是View,这是因为要识别Image View上的Tap手势。图2-11 添加Tap手势识别器对象

完成之后会在视图设计界面的对象栏中出现Tap手势识别器对象,如图2-12所示。图2-12 对象栏中的Tap手势识别器对象

为Image View对象添加Tap手势识别器后,还需要添加动作事件,这个过程与一般控件添加动作事件类似。打开辅助编辑器,选中对象栏中的Tap手势识别器对象,同时按住Control键,将其拖曳到右边窗口,如图2-13所示。图2-13 拖曳Tap手势识别器对象

放开左键会弹出一个对话框。在Connection列表框中选择Action,将Name命名为foundTap,如图2-14所示。图2-14 设置动作事件

单击Connect按钮,右边的编辑界面将自动添加如下一行代码: @IBAction func foundTap( sender: AnyObject){ }

下面看看核心代码。打开工程TapGestureRecognizer,其中ViewController. swift文件中声明相关的代码如下所示: import UIKit class ViewController: UIViewController { var boolTrashEmptyFlag=false //垃圾桶空标志false桶满,true桶空 var imageTrashFull:UIImage! var imageTrashEmpty:UIImage! @IBOutlet weak var imageView:UIImageView! ... }

ViewController. swift主要代码如下所示: override func viewDidLoad() { super,viewDidLoad() let bundle=NSBundle. mainBundle() let imageTrashFullPath= bundle. pathForResource(”Blend Trash Full”, ofType: ”png”) let imageTrashEmptyPath=bundle. pathForResource( "Blend Trash Empty", ofType: "png") self.imageTrashFull=UIImage(contentsOfFile: imageTrashFullPath!) self.imageTrashEmpty=UIImage(contentsOfFile: imageTrashEmptyPath!) self.imageView, image=self.imageTrashFull } @IBAction func foundTap(sender: AnyObj ect){ NSLog("tap") if boolTrashEmptyFlag{ self. imageView,image= self.imageTrashFull boolTrashEmptyFlag= false } else{ self.imageView,image=self.imageTrashEmpty boolTrashEmptyFlag= true } }

需要注意的是,在viewDidLoad方法中原来的如下代码都不再需要了。 let tapRecognizer - UITapGestureRecognizer(target: self, action: “foundTap:“) tapRecognizer.numberOfTapsRequired = 1 tapRecognizer.numberOfTouchesRequired = 1 self.imageView.addGestureRecognizer(tapRecognizer)

其中程序原来代码中的tapRecognizer.numberOfTapsRequired=1和tapRecognizer.numberOfTouchesRequired=1语句是设置手势识别器的常用属性,如果换成Interface Builder实现,则需要选择Tap手势识别器,然后打开属性检查器,如图2-15所示,在Tap Gesture Recognizer-Recognize中的Taps和Touches就是上面的两个属性。可以根据需要设置这两个属性。图2-15 设置常用属性

代码中@IBAction func foundTap(sender:AnyObject)方法是Tap识别器回调方法。完成之后就可以运行了,可见通过Interface Builder实现也是很简单的。2.2.4 检测Long Press(长按)

检测Long Press(长按)使用的手势识别器是UILongPressGestureRecognizer。使用UILongPressGestureRecognizer实现长按检测也有两种方式:一种是通过代码编程实现;另一种是在Interface Builder中进行设计实现。

下面通过一个实例介绍一下UILongPressGestureRecognizer的使用。这个实例如图2-16(a)所示,在屏幕上有一个装满垃圾桶,长按后倾倒垃圾,如图2-16(b)所示。再长按后又装满,反复变换。图2-16 长按手势识别实例

下面分别介绍两种不同的使用方法。1.通过代码编程实现

实现过程的具体步骤请参考2.2.3节,创建一个LongPressGestureRecognizer工程。工程创建完成后,还需要将图片等资源文件导入工程中。UI设计工作和相关的动作事件连线可以参考2.2.3节,具体步骤这里不再介绍。

下面看看核心代码。打开工程LongPressGestureRecognizer中的ViewController.swift文件,主要代码如下所示: class ViewController: UIViewController { var boolTrashEmptyFlag=false//垃圾桶空标志false桶满,true桶空 var imageTrashFull:UIImage! var imageTrashEmpty:UIImage! @IBOutlet weak var imageView:UIImageView! override func viewDidLoad() { super.viewDidLoad() let bundle= NSBundle. mainBundle() let imageTrashFullPath=bundle. pathForResource("Blend Trash Full", ofType: "png") let imageTrashEmptyPath=bundle. pathForResource( "Blend Trash Empty", ofType: "png") self.imageTrashFull = UIImage(contentsOfFile: imageTrashFullPath!) self.imageTrashEmpty=UIImage( contentsOfFile: imageTrashEmptyPath!) self.imageView.image = self.imageTrashFull let recognizer = UILongPressGestureRecognizer( target: self, action: "foundTap:") ① recognizer.allowableMovement = 100.0 ② recognizer.minimumPressDuration = 1.0 ③ self.imageView.addGestureRecognizer(recognizer) } func foundTap(paramSender: UITapGestureRecognizer) { NSLog("长按state = %i", paramSender. state, rawValue) ④ if (paramSender.state == . Began){ //手势开始 ⑤ if boolTrashEmptyFlag{ self.imageView.image = self.imageTrashFull boolTrashEmptyFlag= false } else{ self.imageView.image=self.imageTrashEmpty boolTrashEmptyFlag = true } } } }

在viewDidLoad方法中初始化视图和手势识别器。其中第①行代码实例化手势识别器UILongPressGestureRecognizer,使用构造方法initWithTarget:action:,target参数是指定回调方法所在目标对象,action参数用来设置手势识别后回调的方法。

第②行代码recognizer. allowableMovement = 100.0设置手势被识别之前,最小移动的距离,单位是points(点)。

第③行代码recognizer. minimumPressDuration=1.0设置手势识别的最短持续时间,单位是秒。

在foundTap:方法中第④行代码中的paramSender. state取得手势识别器的状态。rawValue属性是获得枚举成员的原始值,长按过程中的日志输出如下: 2015-02-04 17:50:36.654 LongPressGestureRecognizer[ 4862:617716]长按state=1 2015-02-04 17:50:38.245 LongPressGestureRecognizer[ 4862:617716]长按state=3

其中,state=1为UIGestureRecognizerStateBegan常量(即Began状态),state = 3为UIGestureRecognizerStateEnded(即Ended状态)。

foundTap:方法是在一次长按手势过程中调用了两次,具体处理的时候需要做一下判断,如代码第⑤行paramSender. state = = . Began所示,判断手势是否开始,然后再进行处理。2.在Interface Builder中进行设计实现

从对象库中拖曳Long Press Gesture Recognizer对象到Image View上,注意不是View,因为要识别Image View上的Long Press手势。然后还需要添加动作事件,这个过程与一般控件添加动作事件类似。具体步骤请参考2.2.3节。

下面看看核心代码。打开工程LongPressGestureRecognizer中的ViewController.swift,代码如下所示: class ViewController: UIViewController { var boolTrashEmptyFlag=false //垃圾桶空标志false桶满,true桶空 var imageTrashFull:UIImage! var imageTrashEmpty:UIImage! @IBOutlet weak var imageView:UIImageView! override func viewDidLoad() { super,viewDidLoad() let bundle = NSBundle.mainBundle() let imageTrashFullPath=bundle. pathForResource("Blend Trash Full", ofType: "png") let imageTrashEmptyPath=bundle.pathForResource( "Blend Trash Empty", ofType: "png") self.imageTrashFull = UIImage(contentsOfFile: imageTrashFullPath!) self. imageTrashEmpty=UIImage( contentsOfFile: imageTrashEmptyPath!) self.imageView,image = self.imageTrashFull } @IBAction func foundTap( sender:AnyObject){ let paramSender = sender as! UILongPressGestureRecognizer NSLog("长按state = % i", paramSender. state, rawValue) if (paramSender. state ==.Began){ //手势开始 if boolTrashEmptyFlag{ self. imageView.image= self.imageTrashFull boolTrashEmptyFlag= false } else{ self.imageView,image=self.imageTrashEmpty boolTrashEmptyFlag = true } } } }

需要注意的是,在viewDidLoad方法中原来的如下代码都不再需要了。 let recognizer - UILongPressGestureRecognizer(target: self, action:"foundTap:") recognizer.allowableMovement = 100.0 recognizer.minimumPressDuration = 1.0 _____ self.imageView.addGestureRecognizer(recognizer)

手势识别器的属性设置:在Interface Builder中选择Long Press手势识别器,然后打开属性检查器,如图2-17所示,在Long Press Gesture Recognizer→Recognize中,MinDuration属性对应于recognizer. minimumPressDuration,Tolerance属性对应于recognizer. allowableMovement。可以根据需要设置这两个属性。图2-17 设置常用属性

完成之后就可以运行了,可见通过Interface Builder实现也是很简单的。2.2.5 检测Pan(平移)

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载