Проблема с жестом: UISwipeGestureRecognizer + UISlider
Возникла проблема, связанная с жестом. Я реализовал UISwipeGestureRecognizer, чтобы получить прокрутку влево и вправо, и это работает нормально. Однако проблема, с которой я сталкиваюсь, заключается в том, что UISlider, который у меня есть в одном представлении, не очень приятен. Скользящее движение ползунков ошибочно воспринимается как прокрутка влево/вправо.
Кто-нибудь испытал эту проблему раньше, получил какие-либо идеи, как ее исправить?
Большое спасибо.
Вот код, содержащийся в контроллере представления:
- (void)viewDidLoad {
[super viewDidLoad];
//Setup handling of LEFT and RIGHT swipes
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) {
NSLog(@"Swipe Right");
//Do stuff
}
if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {
NSLog(@"Swipe Left");
//Do stuff
}
}
Ответы
Ответ 1
Самый простой способ справиться с этим - это, вероятно, предотвращение распознавания распознавания жестов от вашего слайдера. Вы можете сделать это, установив себя как делегат, а затем внедряя
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UISlider class]]) {
// prevent recognizing touches on the slider
return NO;
}
return YES;
}
Если это не сработает, возможно, у ползунка действительно есть подпункты, которые получают прикосновение, поэтому вы можете подойти к цепочке superview
, проверяя каждый вид на этом пути.
Ответ 2
Я закончил тем, что начал работать, прежде чем Лили ответила выше. Вот код, который я использовал, но Лили выглядит чище (не испытал Лили ты):
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
BOOL AllowSwipes = YES;
CGPoint point1 = [touch locationInView:_sliderLeft];
CGPoint point2 = [touch locationInView:_sliderRight];
//Left slider test
if ([_sliderLeft hitTest:point1 withEvent:nil] != nil) {
AllowSwipes = NO;
NSLog(@"On Left Slider");
}
//Right slider test
if ([_sliderRight hitTest:point2 withEvent:nil] != nil) {
AllowSwipes = NO;
NSLog(@"On Right Slider");
}
}
return AllowSwipes;
}
Ответ 3
Версия Swift 4.0. Не забывайте UIGestureRecognizerDelegate.
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if let touchedView = touch.view, touchedView.isKind(of: UISlider.self) {
return false
}
return true
}