触摸、手势与响应者链条

1>4个触摸事件【触摸事件主要是针对视图】

- ( 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;

2>6个手势识别

–UITapGestureRecognizer(点按)

–UIPinchGestureRecognizer(捏合)

–UIPanGestureRecognizer(拖动)

–UISwipeGestureRecognizer(轻扫)

–UIRotationGestureRecognizer(旋转)

–UILongPressGestureRecognizer(长按)

3>响应者链条

1. hitTest 方法,用于检测具体响应用户触摸点视图的方法,

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

1) 如果返回 nil ,表示没有响应的视图

2) 如果返回视图,表示该视图接收用户的响应

2. pointInside 方法

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

point   用户触摸的点,相对于当前视图坐标系的坐标点

event   用户触摸事件,开发中一般程序员不使用,该事件用于在响应者链条上传递

判断触摸点是否在视图内部,在视图内部返回 YES ,否则返回 NO.

以上两个方法,联合使用来判断用户触摸点的位置是否在指定的视图内部,如果是,表示该视图可以接收用户交互。

提示:以上两个方法会被循环递归,多次调用!直至找到最适合响应用户请求的视图!所以,一般情况下,不要轻易重写这两个方法,因为一旦方法内部使用了消耗量大的代码,会严重影响系统的性能!

// 重写pointInside方法,扩大按钮的点击范围
@interface ExtendedHitButton: UIButton

+ (instancetype) extendedHitButton;

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

@end

@implementation ExtendedHitButton

+ (instancetype) extendedHitButton
{
    return (ExtendedHitButton *) [ExtendedHitButton buttonWithType:UIButtonTypeCustom];
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    CGRect relativeFrame = self.bounds;
    UIEdgeInsets hitTestEdgeInsets = UIEdgeInsetsMake(-35, -35, -35, -35);
    CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, hitTestEdgeInsets);
    return CGRectContainsPoint(hitFrame, point);
}

@end

时间: 2024-10-11 21:58:09

触摸、手势与响应者链条的相关文章

IOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别

触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 二.UIResponder UIResponder内部提供了以下方法来处理事件触摸事件- (v

IOS开发—事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别

触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 二.UIResponder UIResponder内部提供了以下方法来处理事件触摸事件- (v

触摸事件传递与响应者链条

触摸事件传递 •发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中 •UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow) •主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步 •触摸事件的传递是从父控件传递到子控件,如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件 响应者链条 1.如果view的控制器存在,就传递给控制器:

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

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

响应者链条

响应时间的完整处理过程: 1.先讲事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件 2.调用最合适控件的touches....方法 3.如果调用了[super touches...];就会将事件顺着响应者链条往上传递,传递给上一个响应者 4.接着就会调用上一个响应者touches...方法 什么事响应者链条? 1.响应者链条是由多个响应者对象链接起来的链条(什么是响应者对象:能处理事件的对象) 2.利用响应者链条,能让多个控件处理同一个触摸事件 3.怎么利用链条往上传

简析响应者链条

谈到响应者链条,首先要有触摸事件和响应者.触摸事件就不解释了,那么什么是响应者? 一.响应者 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象”.例如:UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. 二.事件的传递 有了触摸事件和响应者,就会产生响应者链条.发生触摸事件后,系统会将该事件加入到一个由UIApplication

事件处理以及响应者链条

在ios中,事件UIEvent类来表示,当一个事件发生时,系统会搜集的相关事件信息,创建一个UIEvent对象,最后将该事件转发给应用程序对象(UIApplication).日常生活中,主要有三种类型的事件:触摸事件,加速计事件以及远程遥控事件.下面是官方的一张图片: 当用户通过以上方式触发一个事件时,会将相应的事件对象添加到UIApplication的事件队列中.UIApplication会循环的从队列中拿出第一个事件来处理.首先将该事件分发给UIApplication 的主窗口对象(KeyW

响应者链条(事件的传递)(复习笔记)

1.如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件. 2.在以下几种情况下,控件是不能接收触摸事件 1.不接收用户交换  userInteractionEnable= NO; 2.隐藏 hiden = YES; 3.透明 alpha = 0.0 ~ 0.01; 提示:UIImageView的userInteractionEnable默认为NO,因此UIImageView以及他的子控件默认不接收触摸事件. 3.事件的完整处理过程 1.先将事件对象由上往下传递(由父控件传递给子控件),

UI进阶--响应者链条

响应者:继承了UIResponder的对象就是响应者 响应者链条:1.由多个响应者对象连接起来的链条叫做响应者链条2.什么是上一个响应者?  2.1.如果当前这个view是控制器的view,控制器就是上一个响应者  2.2.如果当前这个view不是控制器的view,那么父控件就是上一个响应者3.利用响应者链条可以让多个控件处理同一个 "触摸事件"  3.1.在最后适合的控件里调用super的touchesBegan方法,这样就将事件传给上一个响应,上一个响应者也可以处理事件了 响应者链