2013-07-26 3 views
2

У меня есть регулярные OpenGL установки/EAGL происходит:IOS Multi-Touch не работает

@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/Отменен/Переехал, а также. Код полностью работает и хорошо отслеживает.

Я также убедиться, что я даю правильные значения для всего:

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. Я не имею в виду ни одного касанияBegan, но индекс никогда не проходит мимо 0. Я также установил точку останова во второй раз, когда он входит в эту функцию, и два пальца не активируют его.

ответ

0

Кажется, все, что я пропускал был такой:

sViewController.view = sViewController.glView; 
+0

Пожалуйста, объясните, почему добавление этой строки решило вашу проблему. – rgettman

+0

Кажется, что представление не было напрямую связано с контроллером представления, multi-touch не вел себя правильно. –

0

Если вы хотите обнаружить несколько касаний (и/или провести различие между одним пальцем, двумя пальцами и т. Д.), Попробуйте использовать UIPanGestureRecognizer. Когда вы его настроите, вы можете указать минимальное и максимальное количество касаний. Затем прикрепите его к виду, где вы хотите обнаружить штрихи. Когда вы получаете от него события, вы можете спросить его, сколько прикосновений оно получает, и ветви соответственно.

Вот яблоко документация:

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

Если вы сделаете это, вы, возможно, не нужно использовать/перемещаемого/закончившихся методы touchesBegan на всех и, в зависимости от того, как вы создали gesturerecognizer, touchesBegan/Moved/Ended никогда не может вызываться.

+0

Я действительно должен использовать touchesBegan/Перемещенные/Закончен, поскольку я обработки жестов/прикасается на более низком уровне (игровой движок). В настоящее время он работает на других платформах. –

+0

Вы проверяете наличие нескольких касаний в touchhesMoved? –

+0

Да. 'touchsMoved', похоже, не вызывает больше одного касания. Если бы это произошло, мой код также потерпел бы крах, потому что он ожидает, что 'touchhesBegan' начнет работать с определенным UITouch. –

0

Использовать [event allTouches] вместо touches. touches представляет только штрихи, которые «изменены». Из яблока Документов

Если вы заинтересованы в штрихах, которые не изменились с моментом последней фазы или которые находятся в другой фазе, чем штрихи в прошли в наборе, вы можете найти их в объект события. На рисунке 3-2 изображен объект события, содержащий объекты касания. Чтобы получить все эти объекты касания, вызовите метод allTouches для объекта события.

+0

К сожалению, это не объясняет, почему 'touchhesBegan' не стреляет для моего второго пальца. –

Смежные вопросы