2016-10-12 3 views
7

На iPhone с поддержкой 3D-касания есть функция, при которой длительное нажатие левой стороны экрана с достаточным усилием открывает, позволяет вам изменять, какое приложение активно. Из-за этого, когда в левой части экрана происходит не движущееся касание, событие касания задерживается на секунду или два, пока iPhone не проверяет, что пользователь не пытается переключать задачи и взаимодействует с приложением.TouchesBegan задержка с левой стороны дисплея

Это серьезная проблема при разработке игры с SpriteKit, так как эти касания задерживаются на секунду каждый раз, когда пользователь нажимает палец на левый край экрана. Я был в состоянии решить эту проблему путем регистрации UILongPressGestureRecognizer в главной сцене в игре, таким образом, отключения TouchesBegan и реализации функции пользовательских штрихов (используются в качестве селектора на жест распознаватель):

-(void)handleLongPressGesture:(UITapGestureRecognizer *)gesture { 

    CGPoint location = [gesture locationInView:self.view]; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     // 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     // 
    } 
    else if (gesture.state == UIGestureRecognizerStateEnded) 
    { 
     // 
    } 
    else if (gesture.state == UIGestureRecognizerStateCancelled) 
    { 
     // 

    } 
} 

-(void)didMoveToView:(SKView *)view { 
    /* Setup your scene here */ 

    UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGesture:)]; 

    longPressGestureRecognizer.delaysTouchesBegan = false; 
    longPressGestureRecognizer.minimumPressDuration = 0; 
    [view addGestureRecognizer:longPressGestureRecognizer]; 

    // continue 
} 

Проблему с этим заключается в том, что мне пришлось бы реализовать распознаватель жестов для каждого касания (включая одновременные), который я ожидаю, что пользователь войдет. Это мешает любым методам touchesBegan в качестве подклассов SKSpriteNode, SKScene и т. Д. И убивает много функциональности.

Есть ли способ отключить эту задержку? При регистрации gestureRecognizer мне удалось установить для свойства delaysTouchesBegan значение false. Могу ли я сделать то же самое для своего SKScene?

Чтобы увидеть эту проблему в действии, вы можете запустить проект SpriteKit по умолчанию и нажать (удерживать в течение секунды или двух) рядом с левой стороной экрана. Вы увидите, что существует задержка между прикосновением к экрану и при отображении SKShapeNodes (в отличие от касания в любом месте на экране).

* Редактирование 1 * Для тех, кто пытается найти способ, чтобы обойти это сейчас, вы можете сохранить жест распознаватель, но установить его cancelsTouchesInView ложь. Используйте распознаватель жестов, чтобы сделать все, что вам нужно, до тех пор, пока TouchesBegan не начнет (touchesBegan получит одно и то же событие касания примерно через секунду после распознавания прикосновения). Как только touchesBegan выйдет, вы можете отключить все, что происходит в распознавателе жестов. Это похоже на небрежное исправление для меня, но оно работает пока.

По-прежнему пытается найти более или менее формальное решение.

+1

Борьба с той же проблемой. Еще хуже то, что прикосновения трогаются, устремляются на устройства 3D Touch без изменения координат x или y, т. К. Вы фактически не двигали пальцем. Мне удалось обойти это, но я не решил проблему, которую вы описали. – crashoverride777

+0

Yup, испытывая ту же проблему с непрерывными касаниями переадресованных вызовов. – Andriko13

+0

На устройствах 3D Touch попробуйте использовать Force Touch, чтобы сделать что-то в касании. Например, в моей игре у меня есть игрок, который стрелял бы, когда вы нажимаете и вводите slowMotion при прокрутке и удержании. Теперь я использую силу, чтобы заставить изменение давления войти в замедленное движение на устройствах 3D Touch, и он чувствует себя отлично. Его очень легко реализовать, просто изменение давления нажатия клавиши Google. Чем для устройств без 3d touch, это то, что я делаю, и у меня еще не было проблем с ним, по крайней мере, с моими играми. http://stackoverflow.com/questions/36060423/swift-spritekit-3d-touch-and-touches-moved – crashoverride777

ответ

0

Я испытал это как пользователь, и это действительно раздражает. Единственное, что сработало для меня, - отключить 3D-прикосновение. В противном случае левая сторона сенсорного экрана почти бесполезна.