iOS Multi-Touch无效

时间:2013-07-26 17:46:57

标签: ios objective-c multi-touch uitouch eaglview

我正在进行常规的OpenGL / EAGL设置:

@interface EAGLView : UIView {
@public
    EAGLContext* context;
}
@property (nonatomic, retain) EAGLContext* context;
@end

@implementation EAGLView
@synthesize context;
+ (Class)layerClass {
    return [CAEAGLLayer class];
}
@end

@interface EAGLViewController : UIViewController {
@public
    EAGLView* glView;
}
@property(nonatomic, retain) EAGLView* glView;
@end

@implementation EAGLViewController
@synthesize glView;

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    for (UITouch* touch in touches) {
        CGPoint location = [touch locationInView:glView];
        int index;
        for (index = 0; index < gCONST_CURSOR_COUNT; ++index) {
            if (sCursor[index] == NULL) {
                sCursor[index] = touch;
                break;
            }
        }
    }
    [super touchesBegan:touches withEvent:event];
}

该实现还包括相应的touchesEnded / Canceled / Moved。代码完全有效并且跟踪良好。

我也确保我为所有事情提供适当的价值:

sViewController = [EAGLViewController alloc];

CGRect rect = [[UIScreen mainScreen] applicationFrame];
sViewController.glView = [[EAGLView alloc] initWithFrame:CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)];
Assert(sViewController.glView);
sViewController.glView.userInteractionEnabled = YES;
sViewController.glView.multipleTouchEnabled = YES;
sViewController.glView.exclusiveTouch = YES;

这一切都很好,但我从来没有收到过多个UITouch。我并不是指单个touchesBegan,但索引永远不会超过0.我还设置第二次进入该功能的断点,并且两根手指不会触发它。

3 个答案:

答案 0 :(得分:0)

如果要检测多个触摸(和/或区分一个手指,两个手指等触摸),请尝试使用UIPanGestureRecognizer。设置时,您可以指定最小和最大触摸次数。然后将其附加到要检测触摸的视图。当您收到来自它的事件时,您可以询问它收到了多少触摸并进行相应的分支。

这是苹果文档:

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIPanGestureRecognizer_Class/Reference/Reference.html

如果你这样做,你可能根本不需要使用touchesBegan / Moved / Ended方法,并且根据你设置的手势识别器的方式,touchesBegan / Moved / Ended可能永远不会被调用。

答案 1 :(得分:0)

使用[event allTouches]代替touchestouches仅代表“已更改”的触摸。来自apple docs:

  

如果您对自上次以来没有改变的接触感兴趣   阶段或与阶段不同的阶段   传入集合,您可以在事件对象中找到它们。图3-2   描述包含触摸对象的事件对象。得到所有   这些触摸对象,在事件对象上调用allTouches方法。

答案 2 :(得分:0)

似乎我所缺少的就是:

sViewController.view = sViewController.glView;