UILongPressGestureRecognizer стоп-ручка без остановки касания - PullRequest
6 голосов
/ 13 марта 2012

Я использую класс UILongPressGestureRecognizer для обработки, если выбран один элемент.

Логика следующая: пользователь нажимает в течение 1 секунды элемент (подкласс UIView). Когда жест обнаружен, элемент выделяется и перемещается.

Пользователь должен перемещать этот элемент по экрану, не переставая прикасаться к нему.

Проблема, с которой я сталкиваюсь, заключается в том, что жест распознает касания теней Began / Move / Ended, необходимые для того, чтобы класс элементов организовал движение.

Я попытался удалить распознанный жест, как только обнаружен и выбран элемент. Но все равно отправка сообщений на дескриптор жеста, а не на вызовы, затрагивает методы.

Кто-нибудь знает, как остановить «прослушивание» распознавателя жестов, не отрывая палец от экрана?

Спасибо.

Вот код:

-(void)addGestures
{
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                               initWithTarget:self 
                                               action:@selector(handleLongPress:)];
    longPress.minimumPressDuration = iItemLongPressTime;
    [self addGestureRecognizer:longPress];
    [longPress release];
}
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {

        NSLog(@"Long press Ended");
    }
    else {
        if (self.isSelected) return;

        if ([delegate respondsToSelector:@selector(singleTouch:)])
            [delegate singleTouch:self];

        [self removeGestureRecognizer:[self.gestureRecognizers objectAtIndex:0]];

        NSLog(@"Long press detected.");
    }
}

Как видно из ветви else, вызовы делегатов позволяют всем процедурам пометить этот элемент как выбранный и сразу после удаления распознавателей.

Что мне не хватает?

- EDIT -

Готово! Это работает:

#pragma mark Gesture Functions
-(void)addGestures
{
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
                                               initWithTarget:self 
                                               action:@selector(handleLongPress:)];
    longPress.minimumPressDuration = iItemLongPressTime;
    [self addGestureRecognizer:longPress];
    [longPress release];
}
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) {

        NSLog(@"Long press Ended");
    }
    else {
        NSLog(@"Long press detected.");

        if (self.isSelected) return;

        if ([delegate respondsToSelector:@selector(singleTouch:)])
            [delegate singleTouch:self];

        [sender removeTarget:self action:@selector(handleLongPress:)];
        sender.enabled = NO;
        [self removeGestureRecognizer:sender];



    }
}

Привет!

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Имеет ли пользовательский класс UIView собственный код обработки касания?Если нет, простое решение состоит в том, чтобы установить для свойства allowableMovement UILongPressGestureRecognizer значение CGFLOAT_MAX или другое большое число и использовать обратные вызовы обновления жестов для перетаскивания своего пользовательского представления.Вы можете получить смещение, используя метод - (CGPoint)locationInView:(UIView *)view в суперпредставлении, и сравнить его положение с началом распознавания.

1 голос
/ 13 марта 2012

У меня есть два решения.

  1. Для анимации uiview, пожалуйста, напишите новый класс, который унаследован от класса UIView, и реализуйте делегаты касания вместо того, чтобы писать Gustures для обработки анимации (если делегаты касания не запускаются в текущем классе).

2.Я успешно удалил UILongPressGestureRecognizer после его запуска один раз.

Пожалуйста, используйте приведенный ниже код. Спросите меня, если у вас есть какие-либо вопросы

Шаги, которые я сделал

Я добавил UIView как "myView" в мой основной вид при загрузке основного вида.

Я присвоил тег myView (вы можете указать 1,2,3… и т. Д.), Чтобы отличить постукивающее представление от подпредставлений основного вида.

Назначил жест myILongPressGestureRecognizer для myView и назначил цель как метод "moveMe".

Когда пользователь нажал на myView long, сработает метод «moveMe».

Затем я итерировал подпредставления mainView с условием Tag == 1

Я удалил UILongPressGestureRecognizer из подпредставления. Как мы можем знать, основной вид пометки Tagged 1 - это myView.

Итак, NSLog (@ "жест удален"); и NSLog (@ "moveMe"); будет входить в консоль только один раз.

NSLog (@ "touchesBegan"); будет запускаться первым вместо вызова метода moveMe.

Тогда NSLog (@ "touchesBegan"); будет срабатывать всегда после удаления жеста. Метод "moveMe" никогда не сработает.

Код

    - (void)viewDidLoad {    
        //Adding to UIView to main view when application is loading.
         UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 80, 80)];        
         myView.backgroundColor = [UIColor viewFlipsideBackgroundColor];
          myView.tag = 1; //adding a tag to identify it.
        //Adding Long Press Gesture to the UIView.
        UILongPressGestureRecognizer *myGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(moveMe:)];
        [myView addGestureRecognizer:myGesture];
        [myGesture release];
        myGesture = nil;   
       [self.view addSubview:myView];   
       [myView release];
        myView = nil;    
        [super viewDidLoad];
    }    

    //Method to trigger when user pressed long on the added UIView.

 -(void)moveMe:(id)sender
 { 
      for (UIView *subViews in [self.view subviews]) 
      { 
            if (subViews.tag == 1) { 
                 [subViews removeGestureRecognizer:sender];
                 NSLog(@"gesture removed");
             }    
         }    
         NSLog(@"moveMe");
    }    
 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
     NSLog(@"touchesBegan");
 }

или, пожалуйста, обратитесь Отключить распознаватель жестов iOS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...