2016-10-02 4 views
4

У меня возникла проблема, когда первый звонок touchesBegan:withEvent: на UIView или UIViewController задерживается при касании левого края экрана. Это, похоже, новая проблема с iOS 10, и это происходит только на устройствах с 3D Touch (iPhone 6s и новее). Фактически, если вы отключите 3D-коснуться в целом -> Доступность, проблема исчезнет.`touchesBegan: withEvent:` задерживается на левом краю экрана

Однако проблема не возникает, если вы используете UIGestureRecognizers. Моим обходным решением на данный момент является создание подкласса UIGestureRecognizer, который переопределяет методы touches* и пересылает их к моей старой реализации.

Это просто ошибка или есть способ избавиться от задержки?

ответ

5

попробуйте добавить это в метод viewdidappear. это может решить проблему. это случилось со мной, но я получил этот код из переполнения стека, который исправил мою проблему. надеюсь, это вам тоже поможет

let window = view.window! 
let gr0 = window.gestureRecognizers![0] as UIGestureRecognizer 
let gr1 = window.gestureRecognizers![1] as UIGestureRecognizer 
gr0.delaysTouchesBegan = false 
gr1.delaysTouchesBegan = false 
+0

Hm Я вижу, как это будет решить непосредственную проблему, но баловаться с системой жеста распознавателями кажется, что это будет вызывать больше проблем, вниз по линии – Jayson

+0

я еще некоторые исследований и это кажется лучшим решением на данный момент. Эти распознаватели жестов являются экземплярами '_UISystemGestureGateGestureRecognizer' и, по-видимому, в основном используются, чтобы убедиться, что ваше приложение лучше взаимодействует с системными жестами, такими как центр управления или переключения 3D-приложений. Для левого края я полагаю, что задержка была добавлена, чтобы предотвратить случайное взаимодействие приложения, когда пользователь пытается переключать приложения, но в моем случае мне нужны отзывчивые штрихи на левом краю, и все в порядке, если прикосновения срабатывают, когда пользователи пытаются переключать приложения , – Jayson

1

Решение Purteeek, похоже, прекрасно работает в моем случае. Это реализация Objective-C для SpriteKit:

- (void)didMoveToView:(SKView *)view { 

    UIGestureRecognizer* gr0 = view.window.gestureRecognizers[0]; 
    UIGestureRecognizer* gr1 = view.window.gestureRecognizers[1]; 

    gr0.delaysTouchesBegan = false; 
    gr1.delaysTouchesBegan = false; 

} 

Это не связывайтесь с другими жестами распознавателями, и система 3D сенсорная все еще работает отлично. Интересно, почему это не поведение по умолчанию.

+0

Этот патч больше не работает ... – alasker

0

Как danialias Я работаю над игрой. Решение, которое я нашел (в настоящее время работает, тестировалось на iPhone с поддержкой 3D Touch, где это была реальная проблема до этого момента.) Работает как для игр, так и для приложений:

Кажется, что UITapGestureRecognizer не страдает от эта задержка, так что просто добавьте ее к своему виду и используйте ее для обработки кранов.

В моей игре, я храню штрихи и обрабатывать их на каждом интервал обновления, так что я отменяю

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

и там хранится экземпляр UITouch и возвращается NO.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    [self.touches addObject:touch]; 
    return NO; 
} 

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

  • Нет связанных вопросов^_^