iOS

前言

	NS_CLASS_AVAILABLE_IOS(2_0)  @interface UITouch : NSObject
	@available(iOS 2.0, *)		 public class UITouch : NSObject
  • 触摸事件基本都是发生在 viewController 中,首先触摸的对象是视图,而视图的类 UIView 继承了 UIRespnder 类,但是要对事件作出处理,还需要重写 UIResponder 类中定义的事件处理函数。根据不同的触摸状态,程序会调用相应的处理函数。

1、touch 的创建

  • 在系统触摸事件处理方法中实现

  • Objective-C

    	// 获取任意一个触摸对象
     	UITouch *touch = [touches anyObject];
    
    	// 获取任意一个触摸对象
    	UITouch *touch = [[event allTouches] anyObject];
    
    	// 获取指定的 view 触摸对象
    	UITouch *touch = [[event touchesForView:myView] anyObject];
    
    	// 获取指定的 window 触摸对象
    	UITouch *touch = [[event touchesForWindow:self.view.window] anyObject];
    
  • Swift

    	// 获取任意一个触摸对象
    	let touch:UITouch = touches.first! as UITouch
    
    	// 获取任意一个触摸对象
    	let touch2:UITouch = (event?.allTouches()?.first!)! as UITouch
    
    	// 获取指定的 view 触摸对象
    	let touch3:UITouch = (event!.touchesForView(myView!)?.first)! as UITouch
    
    	// 获取指定的 window 触摸对象
    	let touch4:UITouch = (event!.touchesForWindow(self.view.window!)?.first)! as UITouch
    

2、touch 的设置

  • 在系统触摸事件处理方法中实现

  • Objective-C

    	// 设置接收多点触摸
    	/*
    		默认为 NO,即视图默认不接收多点触摸
    	*/
    	self.view.multipleTouchEnabled = YES;
    
  • Swift

    	// 设置接收多点触摸
    	/*
    		默认为 NO,即视图默认不接收多点触摸
    	*/
    	self.view.multipleTouchEnabled = true
    

3、touch 的获取

  • 在系统触摸事件处理方法中实现

  • Objective-C

    	// 获取触摸窗口
    	UIWindow *touchWindow = touch.window;
       	
    	// 获取触摸视图
    	UIView *touchView = touch.view;
       	
    	// 获取触摸手势
    	NSArray *touchGesture = touch.gestureRecognizers;
       	
    	// 获取触摸次数
    	NSUInteger tapCount = touch.tapCount;
       	
    	// 获取触摸时间
    	NSTimeInterval timestamp = touch.timestamp;
        	
    	// 获取触摸状态
    	/*
    		UITouchPhaseBegan,    	   // whenever a finger touches the surface.     触摸开始
    		UITouchPhaseMoved,    	   // whenever a finger moves on the surface.    接触点移动
    		UITouchPhaseStationary,    // whenever a finger is touching the surface but hasn't moved 
    		                           // since the previous event.                  接触点无移动
    		UITouchPhaseEnded,    	   // whenever a finger leaves the surface.      触摸结束
    		UITouchPhaseCancelled,     // whenever a touch doesn't end but we need to stop tracking 
    		                           // (e.g. putting device to face)              触摸取消
    	*/
    	UITouchPhase touchPhase = touch.phase;
       	
    	// 获取触摸位置
    	
    		// 上次触摸点的位置
    		CGPoint lastPoint = [touch previousLocationInView:self.view];
    
    		// 当前触摸点的位置
    		CGPoint currentPoint = [touch locationInView:self.view];
       	
    	// 获取触摸半径
    	CGFloat majorRadius = touch.majorRadius;
    	CGFloat majorRadiusTolerance = touch.majorRadiusTolerance;
    
  • Swift

    	// 获取触摸窗口
    	let touchWindow:UIWindow = touch.window!
      	
    	// 获取触摸视图
    	let touchView:UIView = touch.view!
       	
    	// 获取触摸手势
    	let touchGesture:[AnyObject] = touch.gestureRecognizers!
       	
    	// 获取触摸次数
    	let tapCount:Int = touch.tapCount
       	
    	// 获取触摸时间
    	let timestamp:NSTimeInterval = touch.timestamp
       	
    	// 获取触摸状态
    	/*
    		case Began,        // whenever a finger touches the surface.     触摸开始
    		case Moved,        // whenever a finger moves on the surface.    接触点移动
    		case Stationary,   // whenever a finger is touching the surface but hasn't moved since 
    		                   // the previous event.                        接触点无移动
    		case Ended,        // whenever a finger leaves the surface.      触摸结束
    		case Cancelled,    // whenever a touch doesn't end but we need to stop tracking 
    		                   // (e.g. putting device to face)              触摸取消
    	*/
    	let touchPhase:UITouchPhase = touch.phase
       	
    	// 获取触摸位置
    
    		// 上次触摸点的位置
        	let lastPoint:CGPoint = touch.previousLocationInView(self.view)
    		
    		// 当前触摸点的位置
        	let currentPoint:CGPoint = touch.locationInView(self.view)
      	
    	// 获取触摸半径
    	let majorRadius:CGFloat = touch.majorRadius
     	let majorRadiusTolerance:CGFloat = touch.majorRadiusTolerance
    

4、系统触摸事件处理方法

  • 不用手动调用

  • Objective-C

    	// 触摸开始,重写 UIResponder 中定义的方法
    	- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
    	}
    
    	// 触摸移动,重写 UIResponder 中定义的方法
    	- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
    	}
    
    	// 触摸结束,重写 UIResponder 中定义的方法
    	- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    
    	}
    
    	// 触摸取消,重写 UIResponder 中定义的方法
    	- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    
    	}
    
  • Swift

    	// 触摸开始,重写 UIResponder 中定义的方法
    	override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
    	}
    
    	// 触摸移动,重写 UIResponder 中定义的方法
    	override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
    	}
    
    	// 触摸结束,重写 UIResponder 中定义的方法
    	override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
    	}
    
    	// 触摸取消,重写 UIResponder 中定义的方法
    	override func touchesCancelled(touches: Set<UITouch>!, withEvent event: UIEvent!) {
        	
    	}
    

5、视图随触摸移动

  • Objective-C

    	// 触摸移动
    	- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
        
        	// 获取触摸对象
        	UITouch *touch = [touches anyObject];
        	UIView *tapView = touch.view;
        
        	// 获取触摸点位置
        	CGPoint lastPoint = [touch previousLocationInView:self.view];
        	CGPoint currentPoint = [touch locationInView:self.view];
        
        	// 改变视图中心坐标
        	CGPoint tapViewCenter = tapView.center;
        
        	tapViewCenter.x += currentPoint.x - lastPoint.x;
        	tapViewCenter.y += currentPoint.y - lastPoint.y;
        
        	tapView.center = tapViewCenter;
    	}
    
  • Swift

    	// 触摸移动
    	override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        	// 获取触摸对象
        	let touch:UITouch = touches.first! as UITouch
        	let tapView = touch.view
        
        	// 获取触摸点位置
        	let lastPoint:CGPoint = touch.previousLocationInView(self.view)
        	let currentPoint:CGPoint = touch.locationInView(self.view)
        
        	// 改变视图中心坐标
        	var tapViewCenter = tapView!.center
        
        	tapViewCenter.x += currentPoint.x - lastPoint.x
        	tapViewCenter.y += currentPoint.y - lastPoint.y
        
        	tapView!.center = tapViewCenter
    	}
    

6、单击/双击触摸

  • Objective-C

    	// 触摸结束
    	- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    
        	UITouch *touch = [touches anyObject];
    
        	// 单击
        	if (touch.tapCount == 1) {
    
    			 // 响应单击触摸事件
            	[self performSelector:@selector(singleTapClick) withObject:nil afterDelay:0];
        	}
        	// 双击
        	else if (touch.tapCount == 2) {
    
    			// 取消单击触摸响应事件
            	[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTapClick) object:nil];
            	
    			// 响应双击触摸事件
            	[self performSelector:@selector(doubleTapClick) withObject:nil afterDelay:0];
        	}
    	}
    
    	// 单击触摸响应事件处理
    	- (void)singleTapClick {
    
        	self.view.backgroundColor = [UIColor greenColor];
    	}
    
    	// 双击触摸响应事件处理
    	- (void)doubleTapClick {
    
        	self.view.backgroundColor = [UIColor orangeColor];
    	}
    
  • Swift

    	// 触摸结束
    	override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    
    		let touch = touches.first! as UITouch
    
    		// 单击
        	if touch.tapCount == 1 {
    
    			// 响应单击触摸事件
           	self.performSelector(#selector(singleTapClick), withObject: nil, afterDelay: 0)
        	}
    
        	// 双击
        	if touch.tapCount == 2 {
            
            	// 取消单击触摸响应事件
            	NSObject.cancelPreviousPerformRequestsWithTarget(self, selector: #selector(singleTapClick), object: nil)
            
            	// 响应双击触摸事件
            	self.performSelector(#selector(doubleTapClick), withObject: nil, afterDelay: 0)
        	}
    	}
    
    	// 单击触摸响应事件处理
    	func singleTapClick() {
    
        	self.view.backgroundColor = UIColor.greenColor()
    	}
    
    	// 双击触摸响应事件处理
    	func doubleTapClick() {
    
        	self.view.backgroundColor = UIColor.orangeColor()
    	}
    
原文地址:https://www.cnblogs.com/QianChia/p/5759175.html