IOS之触摸事件和手势Word格式文档下载.docx
《IOS之触摸事件和手势Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《IOS之触摸事件和手势Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
![IOS之触摸事件和手势Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/28/6cc8ff92-e317-4869-a2e8-1cac8a644439/6cc8ff92-e317-4869-a2e8-1cac8a6444391.gif)
因为点击检测视图也是一个响应者对象,应用程序在处理触摸事件时也可以利用响应链。
响应链由一系列的下一个响应者组成。
响应者链处理原则
1.点击检测视图或者第一响应者传递事件或动作消息给它的视图控制器(如果它有的话);
如果没有一个视图控制器,就传递给它的父视图。
2.如果一个视图或者它的视图控制器不能处理这个事件或动作消息,它将传递给该视图的父视图。
3.在这个视图层次中的每个后续的父视图遵循上述的模式,如果它不能处理这个事件或动作消息的话。
4.最顶层的视图如果不能处理这个事件或动作消息,就传递给UIWindow对象来处理。
5.如果UIWindow对象不能处理,就传给单件应用程序对象UIApplication。
如果应用程序对象也不能处理这个事件或动作消息,将抛弃它。
触摸信息有时间和空间两方面,时间方面的信息称为阶段(phrase),表示触摸是否刚刚开始、是否正在移动或处于静止状态,以及何时结束—也就是手指何时从屏幕抬起。
触摸信息还包括当前在视图或窗口中的位置信息,以及之前的位置信息(如果有的话)。
当一个手指接触屏幕时,触摸就和某个窗口或视图关联在一起,这个关联在事件的整个生命周期都会得到维护。
触摸事件的阶段
事件处理方法
在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发送这些消息:
当一个或多个手指触碰屏幕时,发送touchesBegan:
withEvent:
消息。
当一个或多个手指在屏幕上移动时,发送touchesMoved:
当一个或多个手指离开屏幕时,发送touchesEnded:
当触摸序列被诸如电话呼入这样的系统事件所取消时,发送touchesCancelled:
触摸事件实例EventInfo
#import<
UIKit/UIKit.h>
@interfaceTouchView:
UIView{
}
-(void)logTouchInfo:
(UITouch*)touch;
@end
@implementationTouchView
(UITouch*)touch{
CGPointlocInSelf=[touchlocationInView:
self];
CGPointlocInWin=[touchlocationInView:
nil];
NSLog(@"
touch.locationInView={%2.3f,%2.3f}"
locInSelf.x,locInSelf.y);
touch.locationInWin={%2.3f,%2.3f}"
locInWin.x,locInWin.y);
touch.phase=%d"
touch.phase);
touch.tapCount=%d"
touch.tapCount);
-(void)touchesBegan:
(NSSet*)toucheswithEvent:
(UIEvent*)event{
touchesBegan-touchcount=%d"
[touchescount]);
for(UITouch*touchinevent.allTouches){
[selflogTouchInfo:
touch];
}
touch.phase,触摸事件的阶段。
touch.tapCount,触摸事件的轻碰次数,可以判断双击事件。
UIEvent的allTouches方法,可以获得触摸点的集合,可以判断多点触摸事件。
-(void)touchesMoved:
touchesMoved-touchcount=%d"
-(void)touchesEnded:
touchesEnded-touchcount=%d"
-(void)touchesCancelled:
touchesCancelled-touchcount=%d"
手势在iPhone中很重要,手势就是手触摸屏幕的方式。
单碰击
双碰击
多点触摸(合拢和展开)
轻抚
……
单碰击和双碰击实例:
MultiTap
单碰击为红色,双碰击为蓝色
@interfaceMultiTapView:
#import"
MultiTapView.h"
@implementationMultiTapView
-(void)turnBlue{
self.backgroundColor=[UIColorblueColor];
-(void)turnRed{
self.backgroundColor=[UIColorredColor];
//START:
code.MultiTapView.touchesBegan:
UITouch*touch=[touchesanyObject];
if(touch.tapCount==2){
[[selfclass]cancelPreviousPerformRequestsWithTarget:
self
selector:
@selector(turnRed)
object:
//END:
code.MultiTapView.touchesEnded:
if(touch.tapCount==1){
[selfperformSelector:
@selector(turnRed)withObject:
nilafterDelay:
0.10f];
[selfturnBlue];
[selfperformSelector:
是在0.1秒后调用turnRed方法。
[[selfclass]cancelPreviousPerformRequestsWithTarget:
selfselector:
@selector(turnRed)object:
是取消调用方法turnRed。
多点触摸(合拢和展开)PinchZoom
PinchZoomView.h文件
QuartzCore/QuartzCore.h>
@interfacePinchZoomView:
CALayer*robotLayer;
CGFloatpreviousDistance;
CGFloatzoomFactor;
BOOLpinchZoom;
@property(nonatomic,retain)CALayer*robotLayer;
m文件
PinchZoomView.h"
@implementationPinchZoomView
@synthesizerobotLayer;
-(void)awakeFromNib{
self.robotLayer=[CALayerlayer];
UIImage*image=[UIImageimageNamed:
@"
Robot.png"
];
self.robotLayer.contents=(id)[imageCGImage];
self.robotLayer.bounds=CGRectMake(0.0f,0.0f,image.size.width,image.size.height);
self.robotLayer.position=CGPointMake(CGRectGetMidX(self.bounds),CGRectGetMidY(self.bounds));
[self.layeraddSublayer:
self.robotLayer];
pinchZoom=NO;
previousDistance=0.0f;
zoomFactor=1.0f;
awakeFromNib当nib文件被加载的时候,加载器会发送一个awakeFromNib的消息到nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib方法来响应这个消息,执行一些必要的操作。
也就是说通过nib文件创建view对象是执行awakeFromNib。
robotLayer是CALayer对象,本例子中我们把图片对象添加到robotLayer对象中。
使用CALayer需要引入<
头文件和添加QuartzCore.framework框架。
code.PinchZoomView.touchesBegan
if(event.allTouches.count==2){
pinchZoom=YES;
NSArray*touches=[event.allTouchesallObjects];
CGPointpointOne=[[touchesobjectAtIndex:
0]locationInView:
CGPointpointTwo=[[touchesobjectAtIndex:
1]locationInView:
previousDistance=sqrt(pow(pointOne.x-pointTwo.x,2.0f)+
pow(pointOne.y-pointTwo.y,2.0f));
}else{
previousDistance是获得两个点的距离。
pow是平方函数。
sqrt是开平方根函数。
code.PinchZoomView.touchesMoved
if(YES==pinchZoom&
&
event.allTouches.count==2){
CGFloatdistance=sqrt(pow(pointOne.x-pointTwo.x,2.0f)+
zoomFactor+=(distance-previousDistance)/previousDistance;
zoomFactor=fabs(zoomFactor);
previousDistance=distance;
self.robotLayer.transform=CATransform3DMakeScale(zoomFactor,zoomFactor,1.0f);
code.PinchZoomView.touchesEnded
if(event.allTouches.count!
=2){
if(event.allTouches.count==1){
//NSArray*touches=[event.allTouchesallObjects];
//UITouch*touch=[touchesobjectAtIndex:
0];
NSIntegertapCount=[touchtapCount];
if(tapCount==2){
zoomFactor+=0.4;
}elseif(tapCount==3){
zoomFactor+=0.6;
}elseif(tapCount==4){
zoomFactor+=0.8;
-(void)dealloc{
self.robotLayer=nil;
[robotLayerrelease];
[superdealloc];