前言
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 的设置
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()
}