此文转载自:http://www.oschina.net/translate/implement-gesture-recognizers-swift

在这次IOS应用开发教程中,我们打算实现手势识别。正如你所知道的,IOS支持大量的手势操作,它们能提供了很好的应用控制和出色用户体验。

让我们开始吧!

首先需要在Xcode中创建一个新的Single View Application:

然后点击Next,弹出的窗口要求你填写项目设置。在第一栏 (“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则声明普通变量。


当声明完应用需要的主要变量后,在 viewDidLoad 方法中添加如下代码.
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)
}
这三种方法都很好地完成同一件事.每次在手势在相应的视图中完成后,每种方法都弹出一个对话框.

所以tappedView()方法在用户滑动视图时弹出一个对话框,swipedView()方法在用户触摸滑动 swipe视图时弹出对话框,而longpressedView()方法则在用户长按long press view时弹出对话框.

另两种手势 (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 如何实现手势识别,单点 长按 旋转 放大的更多相关文章

  1. HTML5单页面手势滑屏切换原理分析

    H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,下面通过本文简单说一下其实现原理和主要思路,感兴趣的朋友一起看看吧

  2. h5使用canvas画布实现手势解锁

    这篇文章主要介绍了h5使用canvas画布实现手势解锁的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. Pan和2 Finger Pinch同步iOS – 同时 –

    2手势识别器:和:但同时捏和平底锅不起作用……

  4. ios – 视图的简单拖放?

    我正在学习iOS,但我找不到如何向UIView添加拖放行为.我试过了:它说“UIView没有可见的接口声明选择器addTarget”此外,我尝试添加平移手势识别器,但不确定这是否是我需要的它被称为,但不知道如何获得事件的坐标.在iOS中注册移动事件回调/拖放操作的标准简单方法是什么?

  5. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  6. 检测iOS 3D Touch偷看时间(没有弹出)

    我刚刚开始在我的应用程序中添加基本的3DTouch功能,并且第一次添加它的尝试进展顺利,看起来相当简单.我想知道是否有办法检测到一个偷看已经完成,而不是进入流行音乐.UIViewControllerPreviewingDelegate方法很适合告诉你请求偷看或弹出,但我没有看到一种方式被告知偷看已经结束而没有进入流行音乐.PeekedViewController是否有办法知道它当时是偷看并且消失,

  7. ios – 如何从UICollectionViewCell将pan手势传递给UICollectionVIew?

    )用于整个集合视图,同时还在视图控制器中保持控制–双赢!

  8. ios – 无法识别的选择器发送到实例NSTimer Swift

    解决方法让updateTime成为一个类方法.如果它是在一个纯粹的Swift类中,你需要在@objc前面说明该方法的声明,如:

  9. ios – UINavigationController自定义动画可防止滑动返回工作

    我注意到一些奇怪的东西,可能是UINavigationController中的一个错误.当你覆盖-navigationController:animationControllerForOperation:fromViewController:toViewController:并返回nil(对于默认的动画行为),拖放回去的手势不再有效.此方法的文档说明如果要使用标准导航控制器转换,则应返回“nil”

  10. ios – UITableView滑动手势与UITableViewCell滑动冲突

    以下是我编写的用于在UITableView上放置2个手指滑动的代码:我正在使用SWTableViewCell左右(单击)gestureRecognisers.当使用2个手指向左/向右滑动UITableView时,SWTableViewCell左右手势也会在此之后被触发.如何制止冲突?解决方法当您触摸SWTableViewCell时,将BOOLSWTableViewCellTouch设置为YES.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部