iOS中的事件

iOS中的事件

  • 在用户使用app过程中,会产生各种各样的事件
  • iOS中的事件可以分为3大类型

    —— 触摸事件 ———— 加速计事件 ———— 远程控制事件—

响应者对象

  • 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”
  • UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件

UIResponder

UIResponder内部提供了以下方法来处理事件

  • 触摸事件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
  • 加速计事件
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
  • 远程控制事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

UIView的触摸事件处理

UIView是UIResponder的子类,可以实现下列4个方法处理不同的触摸事件

一根或者多根手指开始触摸view,系统会自动调用view的下面方法

- (void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event

一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法)

- (void)touchesMoved:(NSSet )touches withEvent:(UIEvent )event

一根或者多根手指离开view,系统会自动调用view的下面方法

- (void)touchesEnded:(NSSet )touches withEvent:(UIEvent )event

触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程,系统会自动调用view的下面方法

(void)touchesCancelled:(NSSet )touches withEvent:(UIEvent )event

提示:touches中存放的都是UITouch对象

默认UIView是处理一根手指的情况,要处理多根手指的情况,需要开启多点触摸(Multiple Touch)。

UITouch

  • 当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象
  • 一根手指对应一个UITouch对象
  • UITouch的作用

    保存着跟手指相关的信息,比如触摸的位置、时间、阶段

  • 当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指的触摸位置。
  • 当手指离开屏幕时,系统会销毁相应的UITouch对象

    提示:iPhone开发中,要避免使用双击事件!

UITouch的属性

  • 触摸产生时所处的窗口

    @property(nonatomic,readonly,retain) UIWindow *window;

  • 触摸产生时所处的视图

    @property(nonatomic,readonly,retain) UIView *view;

  • 短时间内点按屏幕的次数,可以根据tapCount判断单击、双击或更多的点击

    @property(nonatomic,readonly) NSUInteger tapCount;

  • 记录了触摸事件产生或变化时的时间,单位是秒

    @property(nonatomic,readonly) NSTimeInterval timestamp;

  • 当前触摸事件所处的状态

    @property(nonatomic,readonly) UITouchPhase phase;

    UITouchPhase是一个枚举类型,包含:

    UITouchPhaseBegan(触摸开始)

    UITouchPhaseMoved(接触点移动)

    UITouchPhaseStationary(接触点无移动)

    UITouchPhaseEnded(触摸结束)

    UITouchPhaseCancelled(触摸取消)

UITouch的方法

-(CGPoint)locationInView:(UIView *)view;

返回值表示触摸在view上的位置

这里返回的位置是针对view的坐标系的(以view的左上角为原点(0, 0))

调用时传入的view参数为nil的话,返回的是触摸点在UIWindow的位置

-(CGPoint)previousLocationInView:(UIView *)view;

该方法记录了前一个触摸点的位置

UIEvent

  • 每产生一个事件,就会产生一个UIEvent对象
  • UIEvent:称为事件对象,记录事件产生的时刻和类型
  • 常见属性

    事件类型

    @property(nonatomic,readonly) UIEventType type;

    @property(nonatomic,readonly) UIEventSubtype subtype;

    事件产生的时间

    @property(nonatomic,readonly) NSTimeInterval timestamp;

  • UIEvent还提供了相应的方法可以获得在某个view上面的触摸对象(UITouch)
typedef NS_ENUM(NSInteger, UIEventType) {
    UIEventTypeTouches,
    UIEventTypeMotion,
    UIEventTypeRemoteControl,
};

typedef NS_ENUM(NSInteger, UIEventSubtype) {
    // available in iPhone OS 3.0
    UIEventSubtypeNone                              = 0,

    // for UIEventTypeMotion, available in iPhone OS 3.0
    UIEventSubtypeMotionShake                       = 1,

    // for UIEventTypeRemoteControl, available in iOS 4.0
    UIEventSubtypeRemoteControlPlay                 = 100,
    UIEventSubtypeRemoteControlPause                = 101,
    UIEventSubtypeRemoteControlStop                 = 102,
    UIEventSubtypeRemoteControlTogglePlayPause      = 103,
    UIEventSubtypeRemoteControlNextTrack            = 104,
    UIEventSubtypeRemoteControlPreviousTrack        = 105,
    UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
    UIEventSubtypeRemoteControlEndSeekingBackward   = 107,
    UIEventSubtypeRemoteControlBeginSeekingForward  = 108,
    UIEventSubtypeRemoteControlEndSeekingForward    = 109,
};

touches和event参数

  • 一次完整的触摸过程,会经历3个状态:

    触摸开始:- (void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event

    触摸移动:- (void)touchesMoved:(NSSet )touches withEvent:(UIEvent )event

    触摸结束:- (void)touchesEnded:(NSSet )touches withEvent:(UIEvent )event

    触摸取消(可能会经历):- (void)touchesCancelled:(NSSet )touches withEvent:(UIEvent )event

  • 4个触摸事件处理方法中,都有NSSet *touches和UIEvent *event两个参数
    • 一次完整的触摸过程中,只会产生一个事件对象,4个触摸方法都是同一个event参数
    • 如果两根手指同时触摸一个view,那么view只会调用一次touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象
    • 如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的 touches参数中只包含一个UITouch对象
    • 根据touches中UITouch的个数可以判断出是单点触摸还是多点触摸
时间: 2024-08-25 11:52:15

iOS中的事件的相关文章

iOS中的事件传递和响应者链条

iOS中的事件传递和响应者链条 本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UIApplication管理的队列事件中来 2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会发发送事件给应用程序的主窗口 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件 4.找到合适的视图控件后,就会调用视图

iOS中touches事件,addtarget ...action和GestureRecognizer详解

刚学完uiview,uicontrol类,许多人知道 touchesBegain,touchesMoved,touchesEnd,GestureRecognizer的用途,但仔细考虑这些事件之间的关系,却令人头疼. 现在以一个例子来分析它们的内部实现: - (void)viewDidLoad { UIButton * btn=[[UIButton alloc]initWithFrame:CGRectMake(20, 40, 50, 50)]; [self.view addSubview:btn]

1.0 iOS中的事件

在用户使用app过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型: UIKit可识别三种类型的输入事件: 触摸事件 加速计事件 / 运动事件 远程控制事件 UIResponder - 响应者对象 概念: 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件. 成员: UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 UIResponder的内部

iOS中的事件传递和响应者链

首先我们来看看iOS中事件的产生和传递过程: 1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的队列事件中 2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会先发送事件给应用程序的主窗口(keyWindow) 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件 4.找到合适的视图控件后,就会调用视图控件的touches方法来作事件的具体处理:touchesBegin... touchesMoved...touch

一、iOS中的事件可以分为3大类型

触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象" UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 二.UIResponder UIResponder内部提供了以下方法来处理事件触摸事件- (void)touchesBegan:(NSSet *)touches withEve

iOS中触摸事件

总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -> 3蓝色 -> 4黄色. 二,找到4黄色后,再从下到上遍历响应者链条:4黄色 -> 3蓝色 -> 2橙色  -> 1白色  -> UIWindow  -> UIApplication 1)如果4黄色实现了touches...这些函数(具体下面第二条)且没有调用 sup

iOS开发笔记--iOS中的触摸事件和手势处理

iOS中的事件可以分为三大类:原文:http://my.oschina.net/aofe/blog/268749 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象". UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. UIRespon

iOS中的触摸事件,手势识别,摇晃事件等

在iOS中,事件可以划分为以下几类: 1.触摸事件:通过触摸,手势进行触发(手指点击.缩放等) 2.运动事件:通过加速器触发(例如手机晃动) 3.远程控制事件:通过其他远程设备触发(例如耳机控制按钮) 在iOS中并不是所有的类都能处理接收并事件,只有继承自UIResponder类的对象才能处理事件(如我们常用的UIView. UIViewController.UIApplication都继承自UIResponder,它们都能接收并处理事件).在UIResponder中 定义了上面三类事件相关的处

iOS中的触摸事件和手势处理

iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象". UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. UIResponder UIResponder内部提供了方法来处理事件; 1> 触摸事件 一