IOS手势识别-UIGestureRecongnizer(swift)

本文介绍了iOS中的手势识别,包括Multitouch、Accelerometer和RemoteControl事件。以Touch为例,详细讲解了UIViewController和自定义UIView如何处理触摸事件。接着,文章阐述了添加手势识别器的步骤,并列举了各种手势识别器如UITapGestureRecognizer、UIPinchGestureRecognizer等的使用方法。最后,提到了Touch的事件阶段和事件传递路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、UI事件的分类:

事件:

Events are objects sent to an app to inform it of user actions. In iOS, events can take many forms: Multi-Touch events, motion events, and events for controlling multimedia. This last type of event is known as a remote control event because it can originate from an external accessory.

1.Multitouch events:屏幕的触摸

2.Accelerometer events:对设备的直接操作比如摇晃

3.RemoteControl events:对设备的远程控制,比如耳机按键控制手机歌曲播放

../Art/events_to_app_2x.png


以Touch为例:

UIViewController 继承自UIResponder

实现了下面四个事件响应:

    func touchesBegan(touches: NSSet, withEvent event: UIEvent)
    func touchesMoved(touches: NSSet, withEvent event: UIEvent)
    func touchesEnded(touches: NSSet, withEvent event: UIEvent)
    func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!)

我们也可以在自定义的UIView类中实现这四个事件:

import UIKit


class LyUIImageView: UIView {


    /*
    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
    }
    */
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }


    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        NSLog("Touch began")
        return
    }
    
    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        NSLog("Touch Moved")
        return
    }


    override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
        NSLog("Touch Cancelled")
        return
    }
    
    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
         NSLog("Touch end")
        return
    }
}


二、代码添加手势识别步骤:

1.建立和设置手势识别器实例,设置target、action和制定一些属性;

 var gester1 = UITapGestureRecognizer(target: self, action: "myImageViewClicked")

2.附加识别器到视图;

        self.myImageView.addGestureRecognizer(gester1)

3.实现响应action。

      func myImageViewClicked(){
         NSLog("my taped")
    }

注意事项:  

无论是手动代码绑定的手势识别还是拖拽的,一定要记住勾选这两项:

UserInteraction Enabled:是否允许 用户交互操作‘

Multiple Touch:是否允许多点触控

手势识别器识别出是什么样的手势,然后决定发送相应的消息到其绑定的VIewController,ViewController相应事件。






三、具体的手势识别控件

1.UITapGestureRecongnizer点击

点击次数:numberOfTapsRequired

点数:numberOfTouchesRequired


2,UIPinchGestureRecongnizer缩放

放大缩小倍数;scale

注意:该手势识别绑定的View的大小,在使用模拟器时如果这两个点不全在View内,会不起作用。

3.UIRotationGestureReconginzer旋转

旋转角度:totation

响应方法:

    @IBAction func myViewRotation(sender: UIRotationGestureRecognizer) {
        self.myView.transform = CGAffineTransformMakeRotation(sender.rotation)
    }


4.UISwipeGestureRecongnizer滑动

移动方向:direction-Right Left  Up Down

点数:numberOfTouchesRequired

响应事件:

//direction选中的是哪个哪个就会响应

    @IBAction func myLableSwipe(sender: UISwipeGestureRecognizer) {
      
        if(sender.direction == UISwipeGestureRecognizerDirection.Right){
            transX += 20
            self.myLabel.transform = CGAffineTransformMakeTranslation(transX, 0)
        }
        if(sender.direction == UISwipeGestureRecognizerDirection.Left){
            transX -= 20
         
     self.myLabel.transform = CGAffineTransformMakeTranslation(transX, 0)
        }
       
 if(sender.direction == UISwipeGestureRecognizerDirection.Up){
            transY -= 20
            self.myLabel.transform = CGAffineTransformMakeTranslation(0, transY)
        }
        if(sender.direction == UISwipeGestureRecognizerDirection.Down){
            transY += 20
            self.myLabel.transform = CGAffineTransformMakeTranslation(0, transY)
        } 
    }


小技巧:多点时平移,在模拟器上可以同时按住alt 和 sheft 移动鼠标

5.UIPanGestureRecongnizer平移

minimumNumberOfTouches:最少触控点

maxmumNumberOfTouches:最多触控点

     响应事件:

    @IBAction func myImageViewPan(sender: UIPanGestureRecognizer) {
        var transX = sender.translationInView(myImageView).x
        var transY = sender.translationInView(myImageView).y
        
        myImageView.transform = CGAffineTransformMakeTranslation(transX, transY)
        
    }

6.UILongPressGestureRecongnizer长按

属性:

minimumPressDrution:最小长按时间

tolerance:allowableMovement允许按住时移动点数

taps   touches

响应方法:

    @IBAction func myImageViewLongPressed(sender: UILongPressGestureRecognizer) {
        UIAlertView(title: "您长按了", message: "想干什么", delegate: self, cancelButtonTitle: "取消").show()

    }


四、Touch的事件阶段

事件处理方法:

在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发送这些消息:

当一个或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。

当一个或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。

当一个或多个手指离开屏幕时,发送touchesEnded:withEvent:消息。

当触摸序列被诸如电话呼入这样的系统事件所取消时,发送touchesCancelled:withEvent:消息。


五、事件状态机-如何定义手势识别的交互


手势识别在一个有限状态机的操作 
手势识别从一个状态转换到另一个在一个预先定义的方式。从每一个状态,他们可以将多个可能的下一状态
的基础上是否满足一定的条件。准确的状态机的变化取决于手势识别是离散的或连续的,如图1-3所示。在可能的状态开始所有的手势识别(uigesturerecognizerstatepossible)。他们分析的任何多点触控的序列,他们收到的,并在分析他们要么承认或不承认一个手势。无法识别的手势手势识别过渡到Failed状态(uigesturerecognizerstatefailed)。
当一个离散的手势识别器识别它的手势,手势识别转换可能认可(uigesturerecognizerstaterecognized)和识别是完整的。 连续的手势,手势识别转换可能开始(uigesturerecognizerstatebegan)时所做的姿势是第一个承认。然后,它转换从开始改变(uigesturerecognizerstatechanged),并继续从改变状态发生改变。当用户的手指从屏幕移除,手势识别转变为结束状态(UIGestureRecognizerStateEnded等)和识别是完整的。注意结束状态是一个别名为公认的状态。 


六、触摸传递到试图的默认路径

有时您可能想要在一个手势识别接收触摸。但是,在你可以改变触摸到视图的传递路径,你需要了解的默认行为。在简单的情况下,当一个发生触摸,触摸对象从UIApplication对象传递到UIWindow对象。然后,窗口首先发送到任何手势识别连接在触摸发生的视图(或视图的父视图),它通过触摸到视图对象本身之前。

七、自定义手势识别器的使用
步骤:
1、继承UIGesRecongnizer,import引用UIGesRecongnizerSubclass
2、实现相关的EventPhas方法。
例:
//
//  ViewController.swift
//  CustomUIGestureRecognizerDemo10
//
//  Created by 兰杨 on 15/4/4.
//  Copyright (c) 2015年 ly. All rights reserved.
//


import UIKit


class ViewController: UIViewController {


    @IBOutlet var myImageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //实例化手势识别器
        var customGesture = UICustomGestureRecognizer(target: self, action: "handleCustomGesture")
        //绑定手势识别器和视图
        self.myImageView.addGestureRecognizer(customGesture)
    }
    //实现响应方法
    func handleCustomGesture(){
        NSLog("对角手势正确")
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}



//
//  UICustomGestureRecognizer.swift
//  CustomUIGestureRecognizerDemo10
//
//  Created by 兰杨 on 15/4/4.
//  Copyright (c) 2015年 ly. All rights reserved.
//


import UIKit
import UIKit.UIGestureRecognizerSubclass


class UICustomGestureRecognizer: UIGestureRecognizer {
    
    var leftTop = false
    var rightDowen = false
    var middle = false
    
    override init(target: AnyObject, action: Selector) {
        super.init(target: target, action: action)
    }
    
    override func touchesBegan(touches: NSSet!, withEvent event: UIEvent!) {
         leftTop = false
         rightDowen = false
         middle = false
        
    }
    
    override func touchesMoved(touches: NSSet!, withEvent event: UIEvent!) {
        var myTouch = touches.anyObject() as UITouch
        var myLocation = myTouch.locationInView(self.view)
        
        var _ViewWidth = self.view?.bounds.width
        var _ViewHight = self.view?.bounds.height
        
        if(myLocation.x <= 10 && myLocation.y <= 10){
            leftTop = true
        }else if(myLocation.x + 10 >= _ViewWidth && myLocation.y + 10 >= _ViewHight){
            rightDowen = true
        }else if(myLocation.x/2 == _ViewWidth && myLocation.y/2 == _ViewHight){
            middle = true
        }
        NSLog("leftTop:\(leftTop), rightDown:\(rightDowen)")
        //手势识别后设置手势状态
        if(leftTop == true && rightDowen == true || middle == true){
            self.state = UIGestureRecognizerState.Ended
        }
    }
    
    override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
        
    }
    
    override func touchesEnded(touches: NSSet!, withEvent event: UIEvent!) {
        //手势结束后重置
        var leftTop = false
        var rightDowen = false
        var middle = false
        self.reset()
    }
   
}

详情参见官网:https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值