Проведены ли касания в моей игре?UIGestureEnvironmentSortAndSendDelayedTouches? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть игра для iOS cocos2d (v2) в магазине приложений, которую я не обновлял годами, но недавно обнаружил ошибку и должен был ее исправить.Это потребовало от меня пройти через все трудности, связанные с получением приложения для сборки на современной версии XCode.После того, как я все заработал и был готов отправить свой патч в магазин приложений, я понял, что теперь смехотворно медленная задержка во времени, когда мое приложение фактически обнаруживает, что пользователь коснулся и удерживал его на экране.

Если смотреть на стек вызовов, если я быстро нажимаю на экран, все работает отлично, и моя точка останова быстро срабатывает:

enter image description here

Но если я коснусь экрана и удержу его нажатие, то перед тем, как моя точка останова будет достигнута, задержка составит почти одну секунду, а стек вызовов будет выглядеть следующим образом: enter image description here

Мойвопрос в том, как отключить это поведение, чтобы не было отложенных касаний или вызовов на UIGestureEnvironmentSortAndSendDelayedTouches?Другими словами, мне нужно прикасаться и удерживать экран, чтобы немедленно вызвать событие, точно так же, как при быстром постукивании.

ОБНОВЛЕНИЕ

Вотполная трассировка стека:

 * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
     frame #0: 0x0000000100e79ab0 mygame`-[CCGLView touchesBegan:withEvent:](self=0x0000000102029c40, _cmd="touchesBegan:withEvent:", touches=0x0000000282f373c0, event=0x0000000281d62e20) at CCGLView.m:331
     frame #1: 0x00000001ca6aeaf0 UIKitCore`_UIGestureEnvironmentSortAndSendDelayedTouches + 4324
     frame #2: 0x00000001ca6a97ec UIKitCore`_UIGestureEnvironmentUpdate + 1236
     frame #3: 0x000000019d8896bc CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
     frame #4: 0x000000019d884350 CoreFoundation`__CFRunLoopDoObservers + 412
     frame #5: 0x000000019d8848f0 CoreFoundation`__CFRunLoopRun + 1264
     frame #6: 0x000000019d8840e0 CoreFoundation`CFRunLoopRunSpecific + 436
     frame #7: 0x000000019fafd584 GraphicsServices`GSEventRunModal + 100
   * frame #8: 0x00000001caa98c00 UIKitCore`UIApplicationMain + 212
     frame #9: 0x0000000100c7f8a4 mygame`main(argc=1, argv=0x000000016f2c77d8) at main.m:5
     frame #10: 0x000000019d342bb4 libdyld.dylib`start + 4

1 Ответ

0 голосов
/ 10 июня 2019

Оказалось, что лучший способ решить эту проблему - установить делегат экземпляра окна UIGestureRecognizer:

  # in app delegate: 
  CGRect frame = [[UIScreen mainScreen] bounds];
  UIWindow *window = [[UIWindow alloc] initWithFrame:frame];
  for (UIGestureRecognizer *gestureRecognizer in [window gestureRecognizers]) {
    gestureRecognizer.delegate = self;
  }

и затем реализуйте следующие методы для этого делегата:

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return NO;
}

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return NO;
}

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press {
    return NO;
}
...