此文转载自:http://www.oschina.net/translate/implement-gesture-recognizers-swift
在这次IOS应用开发教程中,我们打算实现手势识别。正如你所知道的,IOS支持大量的手势 *** 作,它们能提供了很好的应用控制和出色用户体验。
让我们开始吧!首先需要在Xcode中创建一个新的Single VIEw Application:
然后点击Next,d出的窗口要求你填写项目设置。在第一栏 (“Product name”) 中填入项目名称后,点击Next.
确保语言选择的是 “Swift”.
设计界面
点击 “Main.storyboard” 文件,拖出6个 UIVIEws放到视图中.把视图排列成如图所示的样子.当你排列UIVIEws时,在每个vIEw下面添加一个UILabel并依图设定文本值。
我们开始写代码吧.
是时候编辑实现文件了 (在我们的案例 “VIEwController.swift” ).
为了声明一些我们将会用到的变量,要在 “class VIEwController: UIVIEwController“块中添加如下代码.
class VIEwController: UIVIEwController { @IBOutlet var tapVIEw: UIVIEw @IBOutlet var swipeview: UIVIEw @IBOutlet var longPressVIEw: UIVIEw @IBOutlet var pinchVIEw: UIVIEw @IBOutlet var rotateVIEw: UIVIEw @IBOutlet var panVIEw: UIVIEw var lastRotation = CGfloat() let tapRec = UITapGestureRecognizer() let pinchRec = UIPinchGestureRecognizer() let swipeRec = UISwipeGestureRecognizer() let longPressRec = UILongPressGestureRecognizer() let rotateRec = UIRotationGestureRecognizer() let panRec = UIPanGestureRecognizer()}
在第2 – 7行,我们声明了在之前界面里排列过的 UIVIEws.
在第8行,我们声明了实现旋转手势要用到的变量(lastRotation).
在第 9 – 14行,我们为每个vIEw声明了一个手势识别对象.
注意:在 Swift中,我们用let关键字声明常量,这意味着它的值在程序运行时不可改变。关键字var则声明普通变量。
overrIDe func vIEwDIDLoad() { super.vIEwDIDLoad() tapRec.addTarget(self,action: "tappedVIEw") pinchRec.addTarget(self,action: "pinchedVIEw:") swipeRec.addTarget(self,action: "swipedVIEw") longPressRec.addTarget(self,action: "longpressedVIEw") rotateRec.addTarget(self,action: "rotatedVIEw:") panRec.addTarget(self,action: "draggedVIEw:") tapVIEw.addGestureRecognizer(tapRec) swipeview.addGestureRecognizer(swipeRec) pinchVIEw.addGestureRecognizer(pinchRec) longPressVIEw.addGestureRecognizer(longPressRec) rotateVIEw.addGestureRecognizer(rotateRec) panVIEw.addGestureRecognizer(panRec) rotateVIEw.userInteractionEnabled = true rotateVIEw.multipletouchEnabled = true pinchVIEw.userInteractionEnabled = true pinchVIEw.multipletouchEnabled = true tapVIEw.userInteractionEnabled = true swipeview.userInteractionEnabled = true longPressVIEw.userInteractionEnabled = true panVIEw.userInteractionEnabled = true}
第 3 – 8行,为每个视图设定手势识别的目标。所谓的目标,就是每个vIEw中的手势完成后要调用的方法。
第 9 -14行,把手势识别添加到视图中.
第15 – 22行,把每个视图的userInteractionEnabled属性设为ture,并把拥有需要多点触控(rotateVIEwandpinchVIEw)的手势所在的视图的multipletouchEnabled属性设为true.
现在,我们编写每个手势识别器要调用的方法 (第3 – 8行设置的目标方法 ).
添加如下代码:
func tappedVIEw(){ let tapAlert = UIAlertController(Title: "Tapped",message: "You just tapped the tap vIEw",preferredStyle: UIAlertControllerStyle.Alert) tapAlert.addAction(UIAlertAction(Title: "OK",style: .Destructive,handler: nil)) self.presentVIEwController(tapAlert,animated: true,completion: nil)} func swipedVIEw(){ let tapAlert = UIAlertController(Title: "Swiped",message: "You just swiped the swipe vIEw",completion: nil)} func longpressedVIEw(){ let tapAlert = UIAlertController(Title: "Long pressed",message: "You just long pressed the long press vIEw",completion: nil)}这三种方法都很好地完成同一件事.每次在手势在相应的视图中完成后,每种方法都d出一个对话框.
所以tappedVIEw()方法在用户滑动视图时d出一个对话框,swipedVIEw()方法在用户触摸滑动 swipe视图时d出对话框,而longpressedVIEw()方法则在用户长按long press vIEw时d出对话框.
另两种手势 (rotate and pinch ) 的代码稍微有点复杂.
为旋转手势添加如下代码:
func rotatedVIEw(sender:UIRotationGestureRecognizer){ var lastRotation = CGfloat() self.vIEw.bringSubvIEwToFront(rotateVIEw) if(sender.state == UIGestureRecognizerState.Ended){ lastRotation = 0.0; } rotation = 0.0 - (lastRotation - sender.rotation) var point = rotateRec.locationInVIEw(rotateVIEw) var currentTrans = sender.vIEw.transform var newTrans = CGAffinetransformRotate(currentTrans,rotation) sender.vIEw.transform = newTrans lastRotation = sender.rotation}
这个方法包含sender:UIRotationGestureRecognizer参数. sender 参数(UIRotationGestureRecognizer类型) 含有这个方法(在这个案例中是rotateRec)调用的手势识别器的值.
第2行声明了lastRotation.
第3行我们把rotateVIEw放到前面.
接下来,在 if语句中,我们检查手势是否完成,如果没有完成,我们就将视图旋转。
第 8 – 10行,我们计算rotate vIEw的旋转程度,第10行,我们设置rotate vIEw的旋转程度。
On line 12 we set thelastRotation作为旋转手势识别器的当前旋转.
现在我们添加pinch 手势的代码:
func pinchedVIEw(sender:UIPinchGestureRecognizer){ self.vIEw.bringSubvIEwToFront(pinchVIEw) sender.vIEw.transform = CGAffinetransformScale(sender.vIEw.transform,sender.scale,sender.scale) sender.scale = 1.0}
在之前方法的第1行中,我们把pinch视图放到了顶端。然后设置每个pinch视图的transform,并把pinchRec的scale设为1.
然后是实现 pan (drag) 手势.添加如下代码:
func draggedVIEw(sender:UIPanGestureRecognizer){ self.vIEw.bringSubvIEwToFront(sender.vIEw) var translation = sender.translationInVIEw(self.vIEw) sender.vIEw.center = CGPointMake(sender.vIEw.center.x + translation.x,sender.vIEw.center.y + translation.y) sender.setTranslation(CGPointZero,inVIEw: self.vIEw)}
第2行,我们把 drag视图放到顶端 (和前面的方法一样).
然后我们声明变量translation,并用sender.translationInVIEw(self.vIEw)的值给它赋值。 完成后,把sender.vIEw object (panRec)的center属性设为计算出来的新center ( 通过CGPointMake(sender.vIEw.center.x + translation.x,sender.vIEw.center.y + translation.y)计算) 并把translation 设为 sender (panRec).
现在,代码部分算是完成了!
现在我们回到 “Main.storyboard” 文件. 选择视图控制器并把声明的每个UIVIEw连接到相应的视图,如下图所示.
完工
现在你可以在模拟器或你的设备上运行该应用并测试手势。
总结以上是内存溢出为你收集整理的Swift 如何实现手势识别,单点 长按 旋转 放大全部内容,希望文章能够帮你解决Swift 如何实现手势识别,单点 长按 旋转 放大所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)