标签:ios 针对 分发 end 消息传递 时间 enabled 不同的 imageview
本文介绍了iOS中使用频率较高的触摸事件,并阐述了事件产生和传递的过程,以及响应者链的事件传递过程
-(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. 加速计事件
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
3. 远程控制事件
-(void)remoteControlReceivedWithEvent:(UIEvent *)event;
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
2. 一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法)
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
3. 一根或者多根手指离开view,系统会自动调用view的下面方法
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
4. 触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程,系统会自动调用view的下面方法
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
- *提示:touches中存放的都是UITouch对象*
UITouch的作用
:保存着跟手指相关的信息,比如触摸的位置、时间、阶段*提示:iPhone开发中,要避免使用双击事件!*
@property(nonatomic,readonly,retain) UIWindow *window;
@property(nonatomic,readonly,retain) UIView *view;
@property(nonatomic,readonly) NSUInteger tapCount;
@property(nonatomic,readonly) NSTimeInterval timestamp;
@property(nonatomic,readonly) UITouchPhase phase;
-(CGPoint)locationInView:(UIView *)view;
-(CGPoint)previousLocationInView:(UIView *)view;
@property(nonatomic,readonly) UIEventType type;
@property(nonatomic,readonly) UIEventSubtype subtype;
- 事件产生的时间
@property(nonatomic,readonly) NSTimeInterval timestamp;
-(void)touchBegan:(NSSet *)touches withEvent:(UIEvent *)event
2. 触摸移动
-(void)touchMoved:(NSSet *)touches withEvent:(UIEvent *)event
3. 触摸结束
-(void)touchEnded:(NSSet *)touches withEvent:(UIEvent *)event
4. 触摸取消
-(void)touchCancelled:(NSSet *)touches withEvent:(UIEvent *)event
发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中
UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)
主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步
找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理
如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件
UIView不接收触摸事件的三种情况:
不接收用户交互
userInteractionEnabled = NO隐藏
hidden = YES透明
alpha = 0.0 ~ 0.01提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的
为了完成手势识别,必须借助于手势识别器----UIGestureRecognizer;
利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势
UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势
每一个手势识别器的用法都差不多,比如UITapGestureRecognizer的使用步骤如下:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
- 设置手势识别器对象的具体属性
// 连续敲击2次
tap.numberOfTapsRequired = 2;
// 需要2根手指一起敲击
tap.numberOfTouchesRequired = 2;
- 添加手势识别器到对应的view上
[self.iconView addGestureRecognizer:tap];
- 监听手势的触发
[tap addTarget:self action:@selector(tapIconView:)];
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
// 没有触摸事件发生,所有手势识别的默认状态
UIGestureRecognizerStatePossible,
// 一个手势已经开始但尚未改变或者完成时
UIGestureRecognizerStateBegan,
// 手势状态改变
UIGestureRecognizerStateChanged,
// 手势完成
UIGestureRecognizerStateEnded,
// 手势取消,恢复至Possible状态
UIGestureRecognizerStateCancelled,
// 手势失败,恢复至Possible状态
UIGestureRecognizerStateFailed,
// 识别到手势识别
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
};
标签:ios 针对 分发 end 消息传递 时间 enabled 不同的 imageview
原文地址:https://www.cnblogs.com/Free-Thinker/p/13176482.html