UITouch 触摸

前言

  • Objective-C

    1
    NS_CLASS_AVAILABLE_IOS(2_0) @interface UITouch : NSObject
  • Swift

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

1、touch 的创建

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

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 获取任意一个触摸对象
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 获取任意一个触摸对象
    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

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

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

3、touch 的获取

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

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    // 获取触摸窗口
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    // 获取触摸窗口
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 触摸开始,重写 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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 触摸开始,重写 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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 触摸移动
    - (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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // 触摸移动
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    // 触摸结束
    - (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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    // 触摸结束
    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()
    }
文章目录
  1. 1. 前言
  2. 2. 1、touch 的创建
  3. 3. 2、touch 的设置
  4. 4. 3、touch 的获取
  5. 5. 4、系统触摸事件处理方法
  6. 6. 5、视图随触摸移动
  7. 7. 6、单击/双击触摸
隐藏目录