• 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()
      	}
      
  • 相关阅读:
    HDU 4346 The Beautiful Road ( 反向考虑 思路题 )
    HTTP 之缓存
    HTTP head meta
    Git远程操作
    git fetch和push的区别
    git 提交 src refspec master does not match any
    git提交远程报错[rejected] master -> master (fetch first)
    (转载)git常用命令
    Git配置和常用命令
    git常用命令(三)
  • 原文地址:https://www.cnblogs.com/QianChia/p/5759175.html
Copyright © 2020-2023  润新知