2013-06-27 20 views
10

Chciałbym wykryć (początkową) pozycję dotykową w moim UIScrollView, gdy użytkownik rozpoczyna przeciąganie. Mam googleed ten problem i wielu wydaje się walczyć z tym właśnie problemem. Teraz, gdy wciąż nie mogę objąć głowy, dlaczego Apple nie pozwoliłby użytkownikom uzyskać dostępu do informacji dotykowych w widoku przewijania, nie mogę pomóc, ale znaleźć rozwiązanie samodzielnie. Jednak wszystkie moje próby zawiodły, więc chciałbym cię zapytać.Wykryj lokalizację dotyku na UIScrollView?

Oto, co myślałem, że działa:

założyłem UIPanGestureRecognizer jak to w moim UIScrollView podklasy i dodać go do swoich Recognizers gestu

UIPanGestureRecognizer *tapDrag = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(touchedAndDragged:)]; 
tapDrag.cancelsTouchesInView = NO; 
tapDrag.delegate = self; 
[self addGestureRecognizer:tapDrag]; 

i odpowiadający mu sposób:

-(void)touchedAndDragged:(UIPanGestureRecognizer*)t{ 

    CGPoint loc = [t locationInView:self]; 
    //do something with location (that is exactly what I need) 
    //... 

    //Now DISABLE and forward touches to scroll view, so that it scrolls normally 
    t.enabled = NO; 
    /**** 
    ????? 
    *****/ 

} 

Jak wskazano w komentarzach, chciałbym wyłączyć gest panoramowania po tym, jak mam punkt, a następnie wyłączyć rozpoznawanie (podczas ciągłego ciągnięcia!) i "przekaż" dotknięcia do mojego widoku przewijania, aby użytkownik mógł przewijać normalnie. Czy to w ogóle możliwe? Czy jest jakieś inne rozwiązanie?

Odpowiedz

31

Studnia UIScrollView ma już wbudowany gest panoramy, z którego można skorzystać. Użycie byłoby tak proste, jak ustawienie klasy jako delegata widoku przewijania (w celu wykorzystania scrollViewWillBeginDragging) i użycie opcji UIDlGestureRecognizer's --locationInView: w celu określenia lokalizacji dotyku.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    CGPoint location = [scrollView.panGestureRecognizer locationInView:scrollView]; 
    NSLog(@"%@",NSStringFromCGPoint(location)); 
} 
+0

czy można wykryć, czy ten zwoju znajduje się w jakimś miejscu x, czy przewijanie w widoku przewijania lub dotyk nie zostaną uruchomione? załóżmy, że mam dwa widoki, mapę i panel poniżej mapy w widoku przewijania, nie chcę, aby widok przewijania uruchamiał delegata po dotknięciu mapy, a mapa powinna zostać dotknięta –

0

Dlaczego nie zdobędziesz lokalizacji początkowej w -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event, która będzie bardziej wygodna i wydajna.

+3

Jestem w pełni świadomy funkcji dotyku i faktycznie próbowałem je zaimplementować, ale w ogóle nie są one wywoływane. –

+0

Nie z włączoną interakcją użytkownika. Jednak wyłącz go i będzie. Ale wtedy nie będziesz w stanie wchodzić w interakcje z żadnym z jego obiektów potomnych ... – Philip