#objective-c #xcode #uigesturerecognizer #swipe
#objective-c #xcode #uigesturerecognizer #проведите пальцем
Вопрос:
У меня есть два типа распознавателя, один для касания и один для смахивания
UIGestureRecognizer *recognizer;
//TAP
recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(numTap1:)];
[(UITapGestureRecognizer *)recognizer setNumberOfTouchesRequired:1];
[self.view addGestureRecognizer:recognizer];
self.tapRecognizer = (UITapGestureRecognizer *)recognizer;
recognizer.delegate = self;
[recognizer release];
//SWIPE RIGHT
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight:)];
self.swipeRightRecognizer =(UISwipeGestureRecognizer *)recognizer;
swipeRightRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:swipeRightRecognizer];
self.swipeRightRecognizer = (UISwipeGestureRecognizer *)recognizer;
[recognizer release];
с помощью этой функции я могу отключить нажатия на некоторые объекты.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ((touch.view == loseView) || (touch.view == subBgView) || (touch.view == btnAgain)) {
return NO;
}
return YES;
}
Как я могу отключить пролистывание?
Большое спасибо!
Ответ №1:
UIGestureRecognizer
имеет свойство с именем enabled
. Этого должно быть достаточно, чтобы отключить ваши пролистывания:
swipeGestureRecognizer.enabled = NO;
Редактировать: Для Swift 5
swipeGestureRecognizer.isEnabled = false
Комментарии:
1. @PeyloW: 1 Я подумал, что мне нужно будет удалить его и повторно добавить в представление.
2. Кроме того, вы можете установить userInteractionEnabled = NO для представления, к которому прикреплен жест. Это удобно, если вы используете какой-то вид наложения, при котором вам все равно захочется отключить базовое содержимое. Это также будет автоматически переключаться на основе скрытых и альфа-значений для представления.
Ответ №2:
Почему бы вам не установить делегат и для распознавателя жестов салфетки и обрабатывать их в рамках одного и того же метода делегирования.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ( [gestureRecognizer isMemberOfClass:[UITapGestureRecognizer class]] ) {
// Return NO for views that don't support Taps
} else if ( [gestureRecognizer isMemberOfClass:[UISwipeGestureRecognizer class]] ) {
// Return NO for views that don't support Swipes
}
return YES;
}
Ответ №3:
У меня похожая проблема. Некоторые из моих пользователей с ограниченными возможностями одновременно нажимают и проводят пальцем, поэтому приложение переходит к следующему экрану. Я настроил опцию, позволяющую им вместо этого использовать касание тремя пальцами. Мне нужно вызвать опцию делегата popoverControllerDidDismissPopover и при первом запуске приложения. Итак, я написал метод, который объединяет ответы выше. Он ищет все распознаватели жестов салфетки и отключает их, затем включает мой распознаватель жестов касания.
- (void)changeGestureRecognizer {
// Three finger tap to move to next screen
if ([Globals sharedInstance].useDoubleTapToMoveToNextScreen) {
// Let’s see which gestures are active and turn off the swipes
for (UIGestureRecognizer *gestureRecognizer in self.view.gestureRecognizers) {
NSLog(@"The gestureRecognizer is %@", gestureRecognizer);
if ( [gestureRecognizer isMemberOfClass:[UISwipeGestureRecognizer class]] ) gestureRecognizer.enabled = NO;
}
// Add the three finger tap
UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeNext)];
[twoFingerTap setNumberOfTapsRequired:1];
[twoFingerTap setNumberOfTouchesRequired:3];
[self.view addGestureRecognizer:twoFingerTap];
}
}