UIView用户事件响应

UIView除了负责展示内容给用户外还负责响应用户事件。本章主要介绍UIView用户交互相关的属性和方法。

1、交互相关的属性

userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除。也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件。

multipleTouchEnabled  默认是NO,如果设置为YES则支持多点触碰。

exclusiveTouch 默认是NO,如果设置为YES则当前UIView会独占整个Touch事件。具体来说就是如果UIView设置了exclusiveTouch属性为YES则当这个UIView成为第一响应者时,在手指离开屏幕前其他view不会响应任何touch事件。

作用举例:UITableView的每个cell都需要使用exclusive,否则同时点击多个cell会触发每个视图的事件响应。手势识别会忽略此属性。

2、触摸响应

了解UIView的触碰响应之前,首先了解在iOS中触碰事件是什么,事件在视图模型中是如何传递的,视图在接收到一个事件是如何响应的。下面介绍触碰事件类UITouch和响应者链来解释事件的工作原理。

在iOS中UITouch类代表触碰事件。当用户触摸屏幕后就会产生相应的事件,所有相关的UITouch对象都被包装在事件中,被程序交由特定的对象处理。UITouch对象包括触碰的详细信息。

UITouch含有5个属性:

window:触碰产生时所处的窗口,由于窗口可能发生变化,当前所在的窗口不一定是最开始的窗口。

view:触碰产生时所处的视图。由于视图可能发生变化,当前视图也不一定是最初的视图。

tapCount:短时间内轻击(tap)屏幕的次数,可根据tapCount判断单击、双击或更多的轻击。

timestamp:时间戳记录了触碰事件产生或变化时的时间。单位是秒。

phase:触碰事件在屏幕上有一个周期,即触碰开始、触碰点移动、触碰结束,中途取消。通过phase可以查看当前触碰事件在一个周期中所处的状态。UITouchPhase枚举:

UITouchPhaseBegan

UITouchPhaseMoved

UITouchPhaseStationary

UITouchPhaseEnded

UITouchPhaseCancelled

当手指触碰到屏幕,无论是单点还是多点触碰,事件都会开始,直到用户所有的手指都离开屏幕。期间所有的UITouch对象都被封装在UIEvent事件对象中,由程序分发给处理者。事件记录了这个周期中所有触碰对象状态的变化。

只要屏幕被触摸,系统会将诺干个触碰信息封装到UIEvent对象中发送给程序,由管理程序UIApplication对象将事件分发。

响应者对象就 是可以响应事件并对事件作出处理的对象。在iOS中UIResponder类定义了响应者对象的所有方法。UIApplication、 UIWindow、UIViewController、UIView以及UIKit中继承自UIView的控件都间接或直接继承自UIResponder 类,这些类都可以当做响应者。

响应者链表 示一系列响应者对象组成的事件传递的链条。当确定了第一响应者后,事件交由第一响应者处理,如果第一响应者不处理事件沿着响应者链传递,交给下一个响应 者。一般来说,第一响应者是UIView对象或者UIView的子类对象,当其被触摸后事件交由它处理,如果它不处理,事件就会交给它的 UIViewController处理(如果存在),然后是它的superview父视图对象,以此类推,直到顶层视图。如果顶层视图不处理则交给 UIWindow对象处理,再到UIApplication对象(如果UIApplication继承自UIResponder)。如果整个响应者链都不 响应这个事件则该事件被丢弃。

UIView类继承了UIResponder类,要对事件作出处理还需要重写UIResponder类中定义的事件处理函数。根据不同的触碰状态,程序会调用相应的处理函数,这些函数包括:

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

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

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

-(void) touchesCancelled:(NSSet *)touches withEvents:(UIEvent *)event;

这几个方法被调用时,对应了UITouch类中的phase属性的4个枚举值。当触碰被取消,如触碰过程中被来电打断,会调用touchesCancelled:touches:方法。

这些方法在开发中并不需要全部实现,可以根据需要重写特定的方法。这4个方法都有两个相同的参数:NSSet类型的touches和UIEvent类型的 event。Touches表示触碰产生的所有的UITouch对象,event表示事件。因为UIEvent包含了整个触碰过程中所有的触碰对象,所以 可以调用allTouches 方法获取该事件内所有触碰对象,也可以调用touchesForView;或者touchesForWindows;取出 特定视图或者窗口上的触碰对象。在这几个事件中,都可以拿到触碰对象,然后根据其位置、状态、时间属性做逻辑处理。

轻击操作很容易引起歧义,比如用户点击了一次之后,并不知道用户是想单击还是只是双击的一部分,或者点了两次之后并不知道用户是想双击还是继续点击。可以使用延迟调用函数解决这个问题。

[objc] view plaincopyprint?

  1. -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
  2. {
  3.   UITouch *touch = [touches anyObject];
  4. if (touch.tapCount == 1)
  5. {
  6. [self performSelector:@selector(setBackground:) withObject:[UIColor blueColor] afterDelay:2];
  7. }
  8. else if(touch.tapCount == 2)
  9. {
  10. [self cancelPreviousPerformRequestsWIthTarget:self              selector:@selector(setBackground:) object:[UIColor blueColor]];
  11. self.view.backgroundColor = [UIColor redColor];
  12. }
  13. }

除了触碰事件外UIResponder还提供了运动事件的支持。

运动事件的方法:

-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event 摇动事件开始

-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event 摇动事件结束

-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event  摇动事件被中断

远程事件:

-(void)remoteControlReceivedWithEvent: 音乐后台播放控制的时候会用到

第一响应者的相关函数:

- (BOOL)canBecomeFirstResponder    默认返回NO

- (BOOL)becomeFirstResponder

- (BOOL)canResignFirstResponder    默认返回YES

- (BOOL)resignFirstResponder;

- (BOOL)isFirstResponder

可以通过becomeFirstResponder方法注册成为第一响应者,通过resignFirstResponder方法不成为第一响应者。比如通过这两个方法操作UITextField来控制键盘的现隐藏。

3、手势

UIView关于手势的方法:

-(void) addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer  增加一个手势。

-(void) removeGestureRecognizer:(UIGestureRecognizer *)getureRecognizer 删除一个手势。

-(BOOL) gestureRecognizerShouldBegan:(UIGestureRecognizer *)gestureRecognizer 询问是否开始执行该手势,默认返回YES。

手势相比触碰事件的好处是可以直接使用已经定义好的手势,开发者不用自己计算手指移动轨迹。

UIGestureRecognizer是一个手势基类,提供了简单的手势实现方式。衍生类如下:

UITabGestureRecognizer         轻击手势

UIPinchGestureRecognizer       捏合手势

UIRotationGestureRecognizer    旋转手势

UISwipeGestureRecognizer  轻扫手势

UIPanGestureRecognizer 拖拽手势

UILongPressGestrueRecognizer 长按手势

UIGestureRecognizer主要方法:

-(id) initWithTarget:action: 初始化方法

-(void)addTarget:action:  

-(void)removeTarget:action: 

主要属性:

UIGestureRecognizerState state 手势识别当前状态

有以下几种情况:

UIGestureRecognizerStatePossibel,  未识别状态

UIGestureRecognizerStateBegan,     手势开始

UIGestureRecognizerStateChanged,  手势改变

UIGestureRecognizerStateEnded, 手势结束

UIGestureRecognizerStateFailured 手势失败,被其他事件中断。

UITabGestureRecognizer  轻击手势任意手指任意次数的点击

属性:

numberOfTapsRequired 点击次数

numberOfTouchesRequired 手指个数

UIPinchGestureRecognizer  捏合或者扩张手势

属性:

scale:初始值为1,两手指距离减少则scale不断变小;两个手指重合则变为0;

velocity:初始值为0,手指移动的相对速度,两手指距离减少为负数,速度越快数值越少;两手指距离变大为整数,速度越快数值越大。

UIRotationGestureRecognizer 旋转手势

属性:

rotation:初始值为0,两手指的旋转弧度,顺时针旋转为正数,逆时针旋转为负数。

velocity:初始值为0手指一动的相对速度,顺时针为正数越快值越大;逆时针为负越快越小。

UISwipGestureRecognizer 轻扫手势,一个手势只能指定一个方向,如果需要指定多个方向需要多个手势

属性:

numberOfTouchesRequired: 手指个数

direction:手势方向,如UISwipeGestureRecognizerDirectionRight 向右

UIPanGestureRecognizer:  拖拽手势,相比轻扫手势,手指与屏幕的交互时间更长。

属性:

mininumNumberOfTouches:默认值为1,最少手指数量

maxnumNumberOfTouches:最大手指数量

UILongPressGestrueRecognizer: 长按手势。

属性:

numberOfTapsRequired:默认值为0,轻击的次数。

numberOfTouchesRequired:默认值是1,手指数量。

mininumPressDuration:默认值为0.5,单位是秒。

allowableMovement:默认值为10,单位是像素。

时间: 2024-10-14 07:02:27

UIView用户事件响应的相关文章

iOS学习笔记(2)— UIView用户事件响应

iOS学习笔记(2)— UIView用户事件响应 UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除.也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件. multipleTouchEnabled  默认是NO,如果设置为YE

【IOS 开发】IOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

一. IOS 项目简介 1. IOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类和资源; (1) HelloWorld 目录 HelloWorld 目录介绍 : -- 命名规则 : 该目录名称与 IOS 项目名称相同, 是主目录; -- 存放内容 : IOS 项目的 源码文件, 界面设计文件, 资源文件都存放在该目录下; -- 源文件 : Objective C 的 .m 和

iOS事件响应链

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 事件传递之响应链 当你设计App时你可能需要动态的响应事件.例如,一个触摸事件可能发生在屏幕上不同的对象中,你需要决定哪个对象来响应这个给定的事件,理解对象如何接收事件. 当用户触发的一个事件发生,UIKit会创建一个包含要处理的事件信息的事件对象.然后她会将事件对象

关于UIView用户交互相关的属性和方法

UIView除了负责展示内容给用户外还负责响应用户事件 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除.也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件. multipleTouchEnabled  默认是NO,如果设置为YES则支持多点触碰. exclusiveTouch 默认是NO,如果设置为YES则当前UIView会独占

事件响应

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

Anroid View事件响应机制和ViewGroup的事件响应分发机制

注:低版本的源码内容比高版本的源码简单,分析起来方便,但是高版本源码更为严密. View的事件响应机制 涉及2个方法dispatchTouchEvent和onTouchEvent 1.View的dispatchTouchEvent方法(事件传递到View,View的这个方法就自动执行.) dispatchTouchEvent返回true,响应事件:返回false,不响应事件. public boolean dispatchTouchEvent(MotionEvent event) { ... L

Container容器控件的使用、Hbox与Vbox布局管理器的使用、以及AjaxAction前后台事件响应、浏览器debug

1.由于有前后台交互功能,需要在Spring上下文中注册一个用于提供服务的bean,对于这个bean使用Spring提供的@Component标注,如果需要使用@Component注解,需要在项目中WebContent->WEB-INF->dorado-home目录下的app-context.xml文件中增加一个配置,配置如下:<context:component-scan base-package="com.bstek.dorado.sample"/> 2.C

【JavaScript学习】-事件响应,让网页交互

什么是事件: JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击按钮或者提交表单数据时,就发生一个鼠标单击(onclick)事件,需要浏览器做出处理,返回给用户一个结果. 主要事件表: 事件1:onclick 说明:onclick是鼠标单击事件,当在网页上单击鼠标时,就会发生该事件.同时onclick事件调用的程序块就会被执行,通常与按钮一起使用. 实例代码:

JavaScript高级用法一之事件响应与网页交互

综述 本篇的主要内容来自慕课网,事件响应与网页交互,主要内容如下 1 什么是事件 2 鼠标单击事件( onclick ) 3 鼠标经过事件(onmouseover) 4 鼠标移开事件(onmouseout) 5 光标聚焦事件(onfocus) 6 失焦事件(onblur) 7 内容选中事件(onselect) 8 文本框内容改变事件(onchange) 9 加载事件(onload) 10 卸载事件(onunload) 什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScri