IPhone iOS, как добавить UILongPressGestureRecognizer и UITapGestureRecognizer к тому же контролю и предотвратить конфликт?
Я создаю приложение для iPhone, которое позволит пользователю переупорядочить некоторые элементы пользовательского интерфейса на экране.
Как добавить идентификатор распознавания жесткого диска и длинный идентификатор распознавания жестов к тому же UIView? Когда я поднимаю палец от длинного нажатия, срабатывает распознаватель жестов. Как временно отключить распознаватель жестов или запретить его стрельбу, когда пользователь выполняет длительное нажатие?
Спасибо!
Ответы
Ответ 1
Чтобы обе команды могли работать вместе, выполните следующий метод делегата:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
Чтобы сделать это так, чтобы длительное нажатие имело первый приоритет, выполните:
[tapGesture requireGestureRecognizerToFail:longPress];
Ответ 2
Чтобы успешно сочетаться, вам необходимо:
1º Добавить в интерфейс gesture delegate в заголовке
@interface ViewController : ViewController <UIGestureRecognizerDelegate>
2º Создайте события жестов и добавьте в исходный файл:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch:)];
[tap setNumberOfTapsRequired:1]; // Set your own number here
[tap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol
UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTouch:)];
[longTap setNumberOfTapsRequired:0]; // Set your own number here
[longTap setMinimumPressDuration:1.0];
[longTap setDelegate:self]; // Add the <UIGestureRecognizerDelegate> protocol
[tap requireGestureRecognizerToFail:longTap]; // Priority long
[self.view addGestureRecognizer:tap];
[self.view addGestureRecognizer:longTap];
3º Добавить обратные вызовы в исходном файле:
- (void) touch: (UITapGestureRecognizer *)recognizer
{
CGPoint location = [recognizer locationInView: self.HUDview];
if (recognizer.state == UIGestureRecognizerStateBegan)
{
NSLog(@"touch UIGestureRecognizerStateBegan");
}
if (recognizer.state == UIGestureRecognizerStateEnded)
{
NSLog(@"touch UIGestureRecognizerStateEnded");
//NSLog(@"Position of touch: %.3f, %.3f", location.x, location.y); // Position landscape
}
}
- (void) longTouch: (UILongPressGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateBegan)
{
NSLog(@"longTouch UIGestureRecognizerStateBegan");
}
if (recognizer.state == UIGestureRecognizerStateEnded)
{
NSLog(@"longTouch UIGestureRecognizerStateEnded");
}
}
4º Доступен распознаватель жестов:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Ответ 3
Как альтернативный подход, не имеют двух отдельных распознавателей - просто используйте распознаватель LongPress для обоих событий:
Настройте следующим образом:
UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)];
categoryPanelDrag.minimumPressDuration = 0.0;
Затем выполните следующие действия:
- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture {
// _dragStarted is a class-level BOOL
if(UIGestureRecognizerStateBegan == gesture.state) {
_dragStarted = NO;
}
if(UIGestureRecognizerStateChanged == gesture.state) {
_dragStarted = YES;
// Do dragging stuff here
}
if(UIGestureRecognizerStateEnded == gesture.state) {
if (_dragStarted == NO)
{
// Do tap stuff here
}
else
{
// Do drag ended stuff here
}
}
return YES;
}
Ответ 4
Я пробовал использовать мобы и подмастерье, но почему-то они не соответствовали моему проекту, поэтому я решил, как показано ниже,
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
NSLog(@"%@ %ld",touch.description, touch.phase);
[self performSelector:@selector(checkTouch:) withObject:touch afterDelay:0.5];
return YES;
}
и
- (void)checkTouch:(UITouch *)touch{
NSLog(@"touch phase = %ld",touch.phase);
if (touch.phase == UITouchPhaseStationary) {
//still holding my hand and this means I wanted longPressTouch
}
if (touch.phase == UITouchPhaseEnded){
//I released my finger so it obviously tap
}
}
Это может быть решение проще, но, конечно, это зависит от проекта.
Ответ 5
Вы можете позаботиться об этом в коде, чтобы во время долгого нажатия установить флаг, и если вызов будет вызван, пока флаг верен или что-то еще, то не выполните код перехода и reset флаг, Я не знаю лучшего способа