我正在尝试构建一个简单的多点触摸应用程序。我是iOS和objectivec/cocoa的新手。所以,若这个问题太愚蠢,请道歉。
我想知道有多少手指现在是活动的,在用户释放一些手指或所有手指后,这些手指都被释放了。我想引起注意,我需要确切地知道哪根手指被松开了。乍一看似乎一切都很容易。。。但在练习中我遇到了一个问题(
假设我同时在屏幕上放下3根手指,过了一段时间后,我又放下了第四根手指。在这种情况下,在我的UIView.m文件中被称为两个"touchesBegan"evens。在第一个事件中,我得到了触摸次数=3',在第二个事件中触摸次数将为=4'(这是正确的,因为这是一个总计数器)。所以这次事件似乎一切都很清楚。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSSet *allTouches = [event allTouches];
NSArray *allObjects=[allTouches allObjects];
touchCount = [NSNumber numberWithInt:[allObjects count]]; // this is my main counter of current active touches.
NSLog(@"%d", touchCount.intValue);
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
//what I should do ????
}
让我们把屏幕分成四部分。想象一下iPad屏幕上有4个矩形。
让我们为这个矩形创建四个4布尔变量。如果我们将存储所有4个矩形的状态。默认情况下,所有变量都将为-false;
bool rectangle1 = false;
bool rectangle2 = false;
bool rectangle3 = false;
bool rectangle4 = false;
然后,当手指开始向下时,在"touchesBegan"事件中,我们更改布尔变量。我们应该改变哪个变量,我通过x-y坐标知道。假设我把手指放在2号矩形上,然后我把另一根手指放在4号矩形上。在这种情况下,变量如下:
bool rectangle1 = false;
bool rectangle2 = true;
bool rectangle3 = false;
bool rectangle4 = true;
在这之后,我将从矩形#4释放一根手指。那么,在"touchesEnded"事件中,我将如何知道这是被释放的手指,从一开始就在矩形#4区域上?
与其编写自定义代码,我强烈建议使用以下类:UIGestureRecognizer,有一些具体的实现可以实现您想要的。
UIGestureRecognizers绝对是正确的方法。我会更进一步,让每个矩形都有自己的手势识别器,或者至少有自己的touchesBegan和touchesEnded实现。
如果矩形之间需要更多的协调,那么这应该是视图控制器的工作。矩形可以根据需要通知视图控制器。
UITouch
有两种方法来确定触摸的当前和以前的位置:locationInView:
和previousLocationInView:
。这些方法提供了在对touchesMoved:withEvent:
的调用之间建立触摸"身份"的唯一可靠方法。通过跟踪locationInView:
返回的值,并在随后的调用中将其与previousLocationInView:
返回的值进行比较,您可以明确地确定您正在查看的"哪个"触摸。
您没有提供足够的信息来确定您试图做的事情是否可以用UIGestureRecognizer
来完成,但如果可以,您可能会发现它们更容易使用。