2010-12-15 8 views
13

Mam UIView, który obejmuje wszystkie UITableView. UIView używa rozpoznawania gestów do kontroli tego, co wyświetla tabela. Nadal potrzebuję przewijania w pionie UITableView i wciskania wierszy. Jak przekazać te informacje do tabeli za pomocą narzędzi do rozpoznawania gestów?Gest Recognizers i TableView

+0

wierzę „[gest tablView]” powinno być „[yourTableView addGestureRecognizer: gest]” –

Odpowiedz

30

Przypisanie gest do widoku tabeli i tabela zajmie się nim:

UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc] 
     initWithTarget:self action:@selector(handleSwipeFrom:)]; 
[gesture setDirection: 
     (UISwipeGestureRecognizerDirectionLeft 
     |UISwipeGestureRecognizerDirectionRight)]; 
[tableView addGestureRecognizer:gesture]; 
[gesture release]; 

Następnie w swoim sposobie działania gest, działają w oparciu o kierunek:

- (void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer { 
    if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) { 
     [self moveLeftColumnButtonPressed:nil]; 
    } 
    else if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) { 
     [self moveRightColumnButtonPressed:nil]; 
    } 
} 

tabela będzie przekazać tylko te gesty, o które prosiłeś, po ich wewnętrznym użyciu.

+0

To jest świetną odpowiedzią. Ale czy możesz mi powiedzieć, jak poznać tableview indexPath w handleSwipeFrom? – dinesh

+4

To nie zadziała - właściwość kierunku na UISwipeGestureRecognizer wskazuje, jakie kierunki MOŻNA rozpoznać (w tym przypadku lewo i prawo), nie w którym kierunku został przesunięty. Konieczne będzie oddzielne rozpoznawanie gestów. –

+1

Tak, rozpoznawanie.direct zawsze będzie 3 i nigdy nie będzie zgodne. Jest to prawdopodobnie błąd: http://stackoverflow.com/questions/3319209/setting-direction-for-uiswipegesturerecognizer – Symmetric

31

Jeśli trzeba znać swoje komórki indexPath:

- (void)handleSwipeFrom:(UIGestureRecognizer *)recognizer { 
    CGPoint swipeLocation = [recognizer locationInView:self.tableView]; 
    NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:swipeLocation]; 
    UITableViewCell *swipedCell = [self.tableView cellForRowAtIndexPath:swipedIndexPath]; 
} 

To był wcześniej odpowiedział UIGestureRecognizer and UITableViewCell issue.

+0

Dziękuję, szukałem tego rozwiązania. Nie miałem pojęcia "locationInView", dzięki bardzo. – carbonr

+0

Uratowałem mój boczek, dziękuję kolego! – jcrowson

7

Próbowałem sugestii Rob Bonner i działa świetnie. Dziękuję Ci.

Ale w moim przypadku wystąpił problem z rozpoznawaniem kierunku. (Directioner.direction zawsze odsyłają 3) Używam SDK IOS5 i Xcode 4.

Wydaje się, że jest spowodowane "[gest setDirection: (left | right)]" Myślę. (ponieważ wynik predefiniowany (dir left | dir right) jest równy 3)

Tak więc, jeśli ktoś ma problem, taki jak ja, i chce rozpoznać przesunięcie w lewo i prawo, a następnie przypisać dwa elementy rozpoznawcze do widoku tabeli z różnymi kierunkami.

Jak to:

UISwipeGestureRecognizer *swipeLeftGesture = [[UISwipeGestureRecognizer alloc] 
              initWithTarget:self 
              action:@selector(handleSwipeLeft:)]; 
[swipeLeftGesture setDirection: UISwipeGestureRecognizerDirectionLeft]; 

UISwipeGestureRecognizer *swipeRightGesture = [[UISwipeGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleSwipeRight:)]; 

[swipeRightGesture setDirection: UISwipeGestureRecognizerDirectionRight]; 

[tableView addGestureRecognizer:swipeLeftGesture]; 
[tableView addGestureRecognizer:swipeRightGesture]; 

i działanie gest poniżej:

- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)recognizer { 
    [self moveLeftColumnButtonPressed:nil]; 
} 

- (void)handleSwipeRight:(UISwipeGestureRecognizer *)recognizer { 
    [self moveRightColumnButtonPressed:nil]; 
} 

I kodowane z funkcją ARC a następnie, jeśli nie korzystasz z ARC, dodaj kody uwalnianiu.

PS: Mój angielski nie jest tak dobry, więc jeśli jest jakaś zdaniowa błędu, korekta będzie bardzo zadowolony :)