ios 监听一个控制器的属性_IOS触摸事件监听和操作和 UIControl对象详解

在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应。

首先,当发生事件响应时,必须知道由谁来响应事件。在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会。当发生事件时,事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方。事件将沿着响应者链一直向下传递,直到被接受并做出处理

路线图如 First Responser——>The Window——>The Application——>App Delegate

正常的响应者链流程经常被委托(delegation)打断,一个对象(通常是视图)可能将响应工作委托给另一个对象来完成(通常是视图控制器ViewController),这就是为什么做事件响应时在ViewController中必须实现相应协议来实现事件委托。

1.触摸和事件

——UITouch

UITouch对象是一个手指接触到屏幕并在屏幕上移动或离开屏幕时创建的。它有几个属性和实例方法:

phase:属性,返回一个阶段常量,指出触摸开始、继续、结束或被取消,分别对应UITouchPhaseBegan、UITouchPhaseMoved等

tapCount:属性,轻按屏幕的次数

timeStamp:属性,触摸发生的时间

view:属性,触摸始于那个视图

window:属性,触摸始于哪个窗口

lacationInView:方法,触摸在指定视图中的当前位置

previousLocationView:方法,触摸在指定视图中的前一个位置

——UIEvent

UIEvent对象包含一组相关的UITouch对象,由UITouch对象组成UIEvent对象,可以理解成一个完整的触摸操作是一个UIEvent,而这一系列完整操作中的每个点就是UITouch(按下、移动、离开)。

UIEvent的作用是提供相关触摸操作的列表,如果要获取在屏幕上触摸的手势,可以使用该对象,这一些列操作都存储在Foundation框架中的NSSet对象中。

——UIResponder

UIResponser提供四个事件响应的方法,这些方法是事件捕捉的核心。这些方法都接收两个参数,一个是NSSet(包含指定阶段的触摸)和一个UIEvent。

touchesBegan:withEvent: 在手指触摸屏幕时报告UITouchPhaseBegan事件

touchesMoved:withEvent: 在手指在屏幕上移动时报告UITouchPhaseMoved事件

touchesEnded:withEvent: 在手指离开屏幕时报告UITouchPhaseEnded事件

touchesCancelled:withEvent: 在因接听电话或其他因素导致取消触摸时报告UITouchPhaseCancelled事件

定义一个方法用来响应触摸事件:

-(void)manageTouches:(NSSet *)touches

{

for(UITouch *touch in touches) {

switch(touch.phase) {

caseUITouchPhaseBegan:

NSLog(@"began...");

break;

caseUITouchPhaseMoved:

NSLog(@"move...");

break;

caseUITouchPhaseEnded:

NSLog(@"end...");

break;

default:

break;

}

}

}

然后在ViewController中响应该方法:

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

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

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

UICONTROL

UIEvent是一系列UITouch的集合,在IOS中负责响应触摸事件。另外还提到了响应者链的概念,在IOS中,所有事件有一个最先响应者,事件可以沿着响应者链向下传递。

接下来是UIControl对象

UIControl是UIView的子类,当然也是UIResponder的子类。UIControl是诸如UIButton、UISwitch、UITextField等控件的父类,它本身也包含了一些属性和方法,但是不能直接使用UIControl类,它只是定义了子类都需要使用的方法。

UIControl对象采用了一种新的事件处理机制,将前一节直接处理的触摸事件转换成简单操作,这样可以无需关心用户访问控件的具体方式。触摸事件到达UIControl对象(由响应者链派遣)后,在UIResponder的方法中(如touchBegan:withEvent)中,UIControl将标准的触摸事件转换为特殊的控件事件,简单的理解就是,UIControl把复杂的触摸事件封装成了简单的易于使用的控件事件。例如通过UIControl对象处理后,按下按钮的事件就被封装成一个控件事件,而不用去判断触摸屏幕的整个操作过程。

例如按钮的单击事件:UIControlEventTouchUpInside

我们所需要知道的是UIControl首先将触摸事件转换为控件事件,再转换为带接收放的操作。我们只要编写第二次转换的代码,就是将控件事件转换为有目标的操作。

使用addTarget:action:forControlEvents

这是UIControl的一个方法,为指定的控件对象添加事件,例如:

[controlObj addTarget:recepientObj action @selector(method) froControlEvents : UIControlEvents];

controlObj是要响应事件的控件对象;

参数receientObj是要把消息发送到哪里,一般是self,通常指实例化控件对象的控制器;

action后面是一个选择器,表示该事件需要响应的方法,事件做什么其实就写在这个方法里面;

最后一个是事件类型,表示响应什么样的事件。

使用的两种方式:

1.通过代码

在代码中新建一个按钮,然后为按钮对象添加addTarget:action:forControlEvents方法,然后编写响应方法即可。

2.通过可视化实现

在IB中按住control键,点击鼠标从按钮拖动到对应的.h文件中,就建立了一个IBAction方法,在此方法中编写事件逻辑便可完成事件响应,用这种方法相比第一种来说更直观,开发效率也更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值