2012-03-13 19 views
6

Używam klasy UILongPressGestureRecognizer do obsługi, jeśli jeden element jest wybrany.UILongPressGestureRecognizer Zatrzymaj uchwyt bez zatrzymywania dotykania

Logika wygląda następująco: Użytkownik naciska na 1 sekundę elementu (podklasa UIView). Po wykryciu gestu przedmiot jest podświetlony i ruchomy.

Użytkownik musi przesunąć ten element po ekranie bez zatrzymywania go.

Problem z którym się stykam jest rozpoznawany przez gesty cieni dotyka/Koniec/Koniec, aby klasa przedmiotu mogła ustawić ruch.

Próbowałem usunąć gest rozpoznany po wykryciu i wybraniu elementu. Ale wciąż wysyłanie wiadomości do uchwytu gestu zamiast metod dotknięcia połączenia.

Ktoś wie, w jaki sposób zatrzymać "słuchanie" czytnika gestów bez opuszczania palca ekranu?

Dzięki.

Oto kod:

-(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."); 
    } 
} 

Jak widać w branży innego wywołuje delegata umożliwia wszystkie procedury, aby oznaczyć ten przedmiot jako wybrany, a po prostu usunąć rozpoznawania, czyli recognizers.

Czego mi brakuje?

--EDIT--

Gotowe! To działa:

#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]; 



    } 
} 

Pozdrawiam!

Odpowiedz

1

Są dwa rozwiązania w moim umyśle.

  1. Dla animacji UIView prosimy napisał nową klasę, która jest dziedziczona z klasy UIView i wdrożenia w dotyku delegatów zamiast pisania Gustures do obsługi animacji (jeśli dotykowe delegaci nie powodują w obecnej klasie).

2.Pewnie usunąłem UILongPressGestureRecognizer po uruchomieniu go raz.

Patrz poniższy kod .ask mnie jeśli masz jakieś pytania

Kroki Zrobiłem

Dodałem UIView jako „myView” do mojego głównego poglądu kiedy main-view ładunki .

Podałem Tag do myView (można podać 1,2,3 ... itd.), Aby odróżnić wybrany widok od podglądu głównego.

Przypisano gest UILongPressGestureRecognizer do myView i przypisano cel jako metodę "moveMe".

Po naciśnięciu przycisku myView long zostanie wywołana metoda "moveMe".

Potem potwierdzili MAINVIEW subviews z == 1

stan Tag I usunięto UILongPressGestureRecognizer z subview.As możemy wiedzieć, że Tagged 1 głównego widok podrzędny jest myView.

Tak więc NSLog (@ "gest usunięty"); i NSLog (@ "moveMe"); zaloguje się w konsoli tylko raz.

The NSLog (@ "touchesBegan"); uruchomi się najpierw zamiast wyzwalać metodę "moveMe".

Następnie NSLog (@ "touchesBegan"); uruchomi się zawsze po usunięciu gestu. Metoda "moveMe" nigdy się nie uruchomi.

Kod

- (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"); 
} 

lub zapoznaj Disable gesture recognizer iOS

+0

proszę spróbować opisać szczegółowo swoje pytanie –

+0

Próbowałem wysłać, aby usunąć metodę nadawcy jako parametr, ale nadal nie działa. – NemeSys

+0

Edytowałem moją odpowiedź ... –

4

Czy zwyczaj klasa UIView mieć swój własny kod obsługi dotykowego? Jeśli nie, prostym rozwiązaniem jest ustawienie właściwości allowableMovement na UILongPressGestureRecognizer do lub jakiejś dużej liczby i użycie wywołań funkcji aktualizacji gestów w celu przeciągnięcia niestandardowego widoku. Możesz uzyskać przesunięcie za pomocą metody - (CGPoint)locationInView:(UIView *)view w superwizji i porównać jego pozycję z początkiem rozpoznawania.

+1

+1 To jest najprostsze rozwiązanie. Zasadniczo: "Jeśli używasz aparatu do rozpoznawania gestów, użyj funkcji rozpoznawania gestów". – NJones

+1

Nie ma potrzeby zmiany właściwości "allowableMovement"; Jest używany tylko do testowania pod kątem awarii. Z komentarzy w 'UILongPressGestureRecognizer.h'' 'Maksymalny ruch w pikselach dozwolony, zanim gest się nie powiedzie .. Po rozpoznaniu (po minimalnym nacisku) nie ma ograniczenia ruchu palca do końca śledzenia dotyku." – NJones

+0

Cześć, dziękuję za odpowiedzi . Podklasa UIView implementuje touchesBegan/Moved/Ended w celu manipulowania rozmiarem i lokalizacją w swoim superview. Korzystanie z gestów wynika z potrzeby zmniejszenia wrażliwości na dotyk każdego przedmiotu. W tej chwili używam rozwiązania wyłączenia obiektu rozpoznawania gestów i działa jak urok. – NemeSys

Powiązane problemy