Я хочу добавить простое распознавание жестов смахивания в свой проект iPhone на основе просмотра. Следует распознавать жесты во всех направлениях (вправо, вниз, влево, вверх).
В документации для UISwipeGestureRecognizer указано:
Вы можете указать несколько направлений, указав несколько констант UISwipeGestureRecognizerDirection с помощью операндов побитового ИЛИ. Направление по умолчанию - UISwipeGestureRecognizerDirectionRight.
Однако для меня это не работает. Когда все четыре направления объединены оператором ИЛИ, распознаются только смахивания влево и вправо.
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
Я исправил это, добавив к представлению четыре распознавателя, но мне любопытно узнать, почему он не работал так, как рекламируется в документации?
- (void)viewDidLoad {
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:(UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
ios
iphone
swipe
uiswipegesturerecognizer
sandisn
источник
источник
Ответы:
Похоже, это ошибка. Вы можете указать допустимые направления, как и вы. Но когда вы пытаетесь получить доступ к фактическому направлению, которое вызвало смахивание в методе селектора действий, вы все равно получаете битовую маску, которую вы изначально установили (для разрешенных направлений).
Это означает, что проверка фактического направления всегда будет неудачной, если разрешено более одного направления. Вы можете легко убедиться в этом, если выведите значение 'direction' в методе селектора (т.е.
-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer
).Отправил отчет об ошибке (№ 8276386) в Apple.
[Обновление] Я получил ответ от Apple, в котором говорится, что поведение работает так, как задумано.
Так, например, в табличном представлении вы можете провести пальцем влево или вправо в ячейке табличного представления, чтобы вызвать `` удаление '' (при этом направления жеста смахивания будут установлены влево и вправо)
Это означает, что исходный обходной путь - это то, как он должен использоваться. Свойство direction можно использовать только для правильного распознавания жестов, но не в методе, выполняемом при успешном распознавании, для сравнения фактического направления, вызвавшего распознавание.
источник
Я заметил, что жесты влево / вправо и вверх / вниз работают вместе попарно, поэтому вам нужно указать только два распознавателя жестов. И документы кажутся неправильными.
источник
Ну, это отстой, я решил проблему, добавив 2 жеста, как упоминал Ларс, и они отлично сработали ...
1) влево / вправо 2) вверх / вниз
источник
Теперь это функция didSwipe
источник
Если вы используете Xcode 4.2, вы можете добавить распознаватели жестов @ раскадровку, а затем связать распознаватели жестов GUI с IBActions.
Вы можете найти распознаватели жестов в библиотеке объектов на панели служебных программ (внизу правой панели).
Затем нужно просто перетащить Control до соответствующего действия.
источник
Если вы хотите, чтобы он обнаруживал все четыре направления, вам нужно создать четыре экземпляра, как вы это делали в своем обходном пути.
Вот почему : тот же экземпляр UISwipeGestureRecognizer, который вы создаете, является экземпляром, который передается селектору в качестве отправителя. Поэтому, если вы установите его для распознавания всех четырех направлений, он вернет true для
sgr.direction == xxx
где xxx - любое из четырех направлений.Вот альтернативный обходной путь, который требует меньше кода (предполагает использование ARC):
источник
Вот пример кода для использования UISwipeGestureRecognizer. Обратите внимание на комментарии.
swipeRight и swipeLeft - это методы, которые вы используете для выполнения определенных действий, основанных на смахивании влево или вправо. Например:
источник
источник
Swift 2.1
Мне пришлось использовать следующие
источник
хм, странно, у меня работает идеально, я делаю то же самое
думаю, тебе стоит попробовать посмотреть на
UIGestureRecognizerDelegate метод
в логах вы должны увидеть что-то вроде:
должен начаться жест; target = <(действие = actionForUpDownSwipeGestureRecognizer :, target =)>; направление = вверх, вниз, влево, вправо>
источник
используйте это, это должна быть битовая операция
источник
Это сводило меня с ума. Наконец-то я нашел надежный способ иметь несколько swipeGestureRecognizers.
Похоже, что в iOS есть ошибка, если имя вашего селектора «действия» одинаково для нескольких swipeGestureRecognizers. Если вы просто назовете их по-другому, например handleLeftSwipeFrom и handleRightSwipeFrom, все заработает.
источник