6

在我的应用程序中,我需要捕捉屏幕上手指的确切数量,我尝试了两种方法,但我有 2 个不同的问题。

第一种方式:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSArray *allTouches = [touches allObjects];
    int count = [allTouches count];
    NSLog(@"number of touch:%d", count);
}

如果我同时使用更多手指,这会给我不准确的触摸次数。

第二种方式:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    int num = [touches count];
    totalTouch = totalTouch+num;
    NSLog(@"number of touch:%d", totalTouch);
}

通过这种方式,我使用了一个全局变量(totalTouch),每次调用 touchbegan 时都会增加它,并且我有完美的触摸次数。自然地,我在 touchend 中将此 var 设置为 '0'

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    totalTouch = 0;
}

我的问题是,用第二种方式我在 touchbegan 中进行控制,这是:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    int num = [touches count];
    totalTouch = totalTouch+num;

    if (totalTouch == numberToVerify){
       //IT ENTER HERE EVERYTIME INSIDE THIS IF
    }
    else{
    }
 }

所以每次它进入 if 条件时,我不想要它,我只想在我有最终的触摸次数时才做这个控制......

4

4 回答 4

11

在你的

 - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     int num = [touches count];
     totalTouch = totalTouch+num;
     NSLog(@"number of touch:%d", totalTouch);
  } 

您可以通过以下方式获取屏幕上的手指数

  [[event allTouches]count]

这可以从- (void)touchesBegan: - (void)touchesEnded:- (void)touchesMoved:

于 2013-04-08T18:06:28.870 回答
1

touchesBegan:withEvent:中,touches参数仅包含“开始”阶段 ( UITouchPhaseBegan) 中的触摸。在touchesEnded:withEvent:中,touches参数仅包含“结束”阶段 ( UITouchPhaseEnded) 中的触摸。同样对于touchesMoved:withEvent:touchesCancelled:withEvent:

如果您希望系统知道所有触摸,请查看event.allTouches.

如果您希望系统知道属于特定视图的所有触摸,请查看[event touchesForView:someView].

UIEvent 类参考

于 2013-04-08T18:03:34.230 回答
1

更新 Swift 3:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    super.touchesBegan(touches, with: event)
    var countTouch = event?.allTouches?.count

//Do whatever you want with that
}

如果你想知道它是否在任何时候发生了变化,在 touchesMoved 中做同样的事情并把它放在一个数组中,你就可以分析它了。

像这样 :

var countTouch:[Int] = []

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    super.touchesBegan(touches, with: event)
    countTouch.append((event?.allTouches?.count)!) //Not really necessary

//Do whatever you want with that
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesMoved(touches, with: event)
    countTouch.append((event?.allTouches?.count)!)
}

希望它对某人有所帮助,请不要犹豫编辑或改进它。我是 Swift 的初学者,所以完全有可能出现错误。

于 2017-06-27T14:03:29.113 回答
0

您的第二个解决方案的问题是,在您的touchesEnded函数中,您设置totalTouch为 0 而不是按allObjects. 当所有触摸都结束时,该函数touchesEnded不会被调用;当任何触摸结束时调用它。

如果我触摸一次,touchesBegan就会被调用。如果我同时再次触摸,touchesBegan则再次调用,totalTouch现在为 2。如果我解除其中一次触摸,touchesEnded则调用allObjects长度为 1,因为仅解除了一次触摸。如果我们在这里将计数器设置为 0 而不是将计数器递减 的大小allObjects,这会打乱整个过程。这是我的解决方案:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    ...
    touchCount += touches.allObjects.count
    ...
}

override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    ...
    touchCount -= touches.allObjects.count
    ...
}
于 2015-03-07T05:08:48.907 回答