您的位置:首页 > 产品设计 > UI/UE

iOS - UITouch

2016-08-10 22:52 127 查看

前言

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()
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: