Swift - 触摸事件(点击,移动,抬起等)说明及用例

在iOS开发中,UIGestureRecognizer可以方便的响应处理手势事件。

而如果要想更精细的处理,我们还需要借助touchesBegan,touchesMoved,touchesEnded等触摸方法。这些方法 都是UIResponder中的方法。视图控制器和视图类,都是UIResponder的子类。正是这个类,让UIView等相关触摸事件得以响应。

具体方法介绍如下:

1,func touchesBegan(touches: NSSet, withEvent event: UIEvent)

通知调用者当有一个或者多个手指触摸到了视图或者窗口时触发此方法。

touches是UITouch的集合,通过UITouch我们可以检测触摸事件的属性,是单拍还是双拍,还有触摸的位置等。

2,func touchesMoved(touches: NSSet, withEvent event: UIEvent)

告诉接收者一个或者多个手指在视图或者窗口上触发移动事件。

默认不允许多点触摸。如果要接收多点触摸事件必须将UIView的属性设置为true。

3,func touchesEnded(touches: NSSet, withEvent event: UIEvent)

当一个触摸事件结束时发出的UITouch实例对象。

4,func touchesCancelled(touches: NSSet, withEvent event: UIEvent)

通知接收者当系统发出取消事件的时候(如低内存消耗的告警框)

下面通过一个样例演示触摸事件得用法:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

import UIKit

class ViewController: UIViewController {

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        //支持多点触摸

        self.view.multipleTouchEnabled = true

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

    }

    

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

        for touch: AnyObject in touches {

            var t:UITouch = touch as! UITouch

            //当在屏幕上连续拍动两下时,背景恢复为白色

            if(t.tapCount == 2)

            {

                self.view.backgroundColor = UIColor.whiteColor()

            }

                //当在屏幕上单击时,屏幕变为红色

            else if(t.tapCount == 1)

            {

                self.view.backgroundColor = UIColor.redColor()

            }

            println("event begin!")

        }

    }

    

    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent)

    {

        for touch: AnyObject in touches {

            var t:UITouch = touch as! UITouch

            println(t.locationInView(self.view))

        }

    }

    

    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent)

    {

        //两点触摸时,计算两点间的距离

        if touches.count == 2{

            //获取触摸点

            let first = (touches as NSSet).allObjects[0] as! UITouch

            let second = (touches as NSSet).allObjects[1] as! UITouch

            //获取触摸点坐标

            let firstPoint = first.locationInView(self.view)

            let secondPoint = second.locationInView(self.view)

            //计算两点间的距离

            let deltaX = secondPoint.x - firstPoint.x

            let deltaY = secondPoint.y - firstPoint.y

            let initialDistance = sqrt(deltaX*deltaX + deltaY*deltaY)

            println("两点间距离:\(initialDistance)")

        }

        println("event end!")

    }

    

    override func touchesCancelled(touches: Set<NSObject>, withEvent event: UIEvent)

    {

        println("event canceled!")

    }

}

时间: 2024-10-12 12:51:23

Swift - 触摸事件(点击,移动,抬起等)说明及用例的相关文章

Android 触摸事件 点击事件的分发机制 详解

最近发现团队里有些员工在做一些自定义控件的时候感觉比较吃力.尤其是做触摸事件这种东西的时候.很多人对机制并不理解.因为百度出来的东西都太理论化了.确实不好理解. 今天带大家坐几个小demo.帮助理解一下. 先从简单的view 的事件分发机制开始解释. 我们首先自定义一个工程 package com.example.testtouch; import android.app.Activity; import android.os.Bundle; import android.util.Log; i

Android 触摸事件 点击事件的分发机制 详解三---责任链模式

前面两节  我们讲述了 android 点击事件的分发流程.其实大家可以细细体会一下,这个分发的过程 始终是从顶层到下层.一层一层的按照顺序进行. 当然了,传到哪一层停止,我们可以通过重写某些方法来完成. 这个地方 android的开发人员很好的利用了 责任链模式来完成这边代码的编写. 下面我们就来讲一下 责任链模式到底是什么.以及如何运用. 大家知道 一个软件公司的基本架构就是 程序员----leader---project manager---boss 这种基础架构. 我们一般都会有team

Android 触摸事件 点击事件的分发机制 详解二

现在我们来看看 事件分发的流程.view group 怎么传递给view的. 首先自定义一个layout 1 package com.example.testtouch; 2 3 import android.content.Context; 4 import android.util.AttributeSet; 5 import android.util.Log; 6 import android.view.MotionEvent; 7 import android.widget.Linear

cocos2d-x:解决点击拖动按钮后,所在的layer监听不到触摸事件的问题

点击拖动按钮后,想让所在的layer监听到屏幕的触摸事件,可以把该按钮拖动开始的时候设置setTouchEnabled为false;例: #include "ui/UIButton.h" bool myDemo::init() { // 设置点击事件 EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = CC_CALLBACK_2(

《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件

原创文章,欢迎转载.转载请注明:关东升的博客 应用与用户进行交互,依赖于各种各样的事件.事件响应者对象是可以响应事件并对其进行处理的对象,响应者链是由一系列链接在一起的响应者组成的.响应者链在事件处理中是非常重要的,响应者链可以把用户事件路由给正确的对象. 响应者对象与响应链 UIResponder是所有响应者对象的基类,它不仅为事件处理,而且也为常见的响应者行为定义编程接口.UIApplication.UIView(及其子类,包括UIWindow)和UIViewController(及其子类)

android中View点击和触摸事件的处理

android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解. 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底 是View

屏幕触摸事件监听,判断上下左右的操作行为,判断方法缩小的操作行为

在手机屏幕上能够实现的人机交互行为,大致包括点击按钮,拉动滑动块,物体缩放,上下左右拉动等. 手机屏幕触摸事件的监听方法: 1.首先要设置一块布局区域,frameLayout/LinearLayout等都可以,并为布局设置id: 2.在Activity中声明相应的布局类型,并通过findViewById()方法找到该布局,然后为该布局区域设置setOnTouchListener()方法,就能监听在相应屏幕触摸操作 实现屏幕触摸事件监听的代码: private LinearLayout Land;

Android 手势&amp;触摸事件

在刚开始学Android的时候,就觉得Google的文档不咋样,在研究手势时,更加的感觉Google的文档写得实在是太差了.很多常量,属性和方法,居然连个描述都没有.没有描述也就罢了,但是OnGestureListener里手势这么多,它也没有一个介绍说明,在没有进行不断才尝试之前,谁能搞懂onLongPress和onShowPress,onScroll和onFling的关系与差别吗?Google真的需要在文档方面做一次大手术了.不过好在经过鄙人不断反复的尝试.从个人的角度为这几个手势动作做出了

Android View 触摸事件传递机制

PS:以现在的眼光看以前写的博客感觉写的很烂,或许或一段时间再看现在的博客会有同样的感觉.所以每时每刻都去学习,去发现和理解新的东西. 引言 由于之前写的一篇关于Android事件传递顺序的博客质量太差,可能是理解不到位的原因,故最近又花了许多时间再次去看Android源码,看完之后有了新的理解,所以打算重新整理这篇博客.理解Android触摸事件传递机制有助于日后的开发以及自定义一些手势效果等.注意:这篇博客是基于Android2.0源码来分析的,不管老版本还是新版本的Android,其内部触