UISwipeGestureRecouncer @selector не вызывается из-за настройки UIPanGestureRecouncer
-
21-12-2019 - |
Вопрос
В моем приложении для iOS у меня есть следующие настройки:
- (void)setupGestures
{
UIPanGestureRecognizer* panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
[self.view addGestureRecognizer:panRecognizer];
UISwipeGestureRecognizer* swipeUpRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
[swipeUpRecognizer setDirection:UISwipeGestureRecognizerDirectionUp];
[self.view addGestureRecognizer:swipeUpRecognizer];
}
// then I have following implementation of selectors
// this method supposed to give me the length of the swipe
- (void)panGesture:(UIPanGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateBegan)
{
startLocation = [sender locationInView:self.view];
}
else if (sender.state == UIGestureRecognizerStateEnded)
{
CGPoint stopLocation = [sender locationInView:self.view];
CGFloat dx = stopLocation.x - startLocation.x;
CGFloat dy = stopLocation.y - startLocation.y;
CGFloat distance = sqrt(dx*dx + dy*dy );
NSLog(@"Distance: %f", distance);
}
}
// this method does all other actions related to swipes
- (void)handleSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
UISwipeGestureRecognizerDirection direction = [gestureRecognizer direction];
CGPoint touchLocation = [gestureRecognizer locationInView:playerLayerView];
if (direction == UISwipeGestureRecognizerDirectionDown && touchLocation.y > (playerLayerView.frame.size.height * .5))
{
if (![toolbar isHidden])
{
if (selectedSegmentIndex != UISegmentedControlNoSegment)
{
[self dismissBottomPanel];
}
else
{
[self dismissToolbar];
}
}
}
}
Итак, проблема в том, что handleSwipe никогда не вызывается... когда я комментирую настройку UIPanGestureRecouncer, handleSwipe начинает работать.
Я новичок в программировании распознавания жестов, поэтому предполагаю, что упускаю здесь что-то фундаментальное.
Любая помощь очень ценится!
Решение
Вам нужно рассказать жестам, как взаимодействовать друг с другом.Это можно сделать, разрешив им работать одновременно (по умолчанию они не будут работать) или настроив один на работу только в случае сбоя другого.
Чтобы они оба работали, сделайте свой класс delegate
за жесты и реализацию
– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
вернуться YES
.
Чтобы настроить один на работу только в случае сбоя другого, используйте requireGestureRecognizerToFail:
.
Другие советы
Продолжительностью и жесткие жесты очень похожи, и это вызывает путаницу,
Есть несколько лекарств:
-
Не настроить сковороду и промах на том же представлении - он может быть установлен на разных подсвечении для предотвращения смущения.
-
Используйте еще один распознатель для промакции, чтобы переключить, как двойной кран или 2 палец, поскольку это нельзя интерпретировать как сковороду
-
Используйте метод делегата - GestureReCognizal: Desberequireciredtofailby GresetureCognizer:
Например, Chaco Если прикосновения начались в области панели / панели инструментов и отказом от распознавателя панорамирования, позволяя использовать промах.