2013-06-02 12 views
27

Mam UIScrollView, do którego dodałem jeden gest tap rozpoznawania, aby pokazać/ukryć niektóre UI nakładkę przy użyciu:Scrollview gest rozpoznawania jeść wszystkie dotykowe wydarzenia

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
[scrollView addGestureRecognizer:singleTap]; 

oraz:

- (void)handleTap:(UITapGestureRecognizer *)sender { 
    // report click to UI changer 
} 

Dodałem easy table view na dole UIScrollView. Wszystko działa poprawnie (przewijanie zarówno w poziomie, jak iw pionie), ale problem polega na tym, że kliknięcia są rozpoznawane tylko przez narzędzie do rozpoznawania gestów (powyżej), ale nie przez łatwy widok tabeli. Po usunięciu linii, która rejestruje detektor gestów, wszystko działa poprawnie, widok tabeli zauważa, że ​​sam klika.

To tak, jakby funkcja rozpoznawania gestów "zjadała" zdarzenia kliknięcia w widoku tabeli i nie propagowała ich w dół.

Każda pomoc jest doceniana

Odpowiedz

61

To powinno rozwiązać Twój problem.
Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
Chodzi o to, aby urządzenie rozpoznające gesty nie połknąć zdarzeń dotyku. Aby to zrobić, musisz ustawić właściwość singlettap cancelsTouchesInView na NO, która jest domyślnie YES.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
singleTap.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTap]; 
+1

To załatwiło sprawę :) –

+2

Mam podobny problem ([moje pytanie] (http://stackoverflow.com/questions/33105678/in-ios-button-tapping-not-fired-when-keyboard-is- widoczne)), ale rozwiązanie nie działa dla mnie. Czasami zdarzenie jest zwalniane, czasem nie. – new2ios

+1

ten jest ostatecznym rozwiązaniem. Thanks zambrey –

5

Można ustawić, które obiekty mają być włączone/wyłączone dla dotyku.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {    
    if (touch.view == [self view]) { 
     return YES; 
    } 
    return NO; 
} 
5

Myślę, że powodem jest to, że User Interaction Enabled jest ustawiony na false dla UIImageView. należy ustawić go na true, aby umożliwić stukając w niego

2

Dzięki @zambrey

Swift 2.2 lub nowszym Wersja:

scrollView.delegate = self 

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed)) 
allowMultipleTouches.numberOfTapsRequired = 1 
allowMultipleTouches.cancelsTouchesInView = false 

scrollView.addGestureRecognizer(allowMultipleTouches) 

Jeśli widok przewijania jest w serii ujęć, nie zapomnij pin Outlet w kontroler widoku. W tym przykładzie scrollView jest gniazdem UIScrollView.

1

TapGestures pracował dla mnie. Z drugiej strony, przesunięcie musiałem wyłączyć przewijanie i zadziałało.

 swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    swipeLeftGesture.direction = .left 
    scrollView.addGestureRecognizer(swipeLeftGesture) 

    swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    scrollView.addGestureRecognizer(swipeRightGesture) 

    scrollView.isScrollEnabled = false 
5

Swift 3,0

let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) 
singleTap.cancelsTouchesInView = false 
singleTap.numberOfTapsRequired = 1 
scrollView.addGestureRecognizer(singleTap) 

A metoda selektor być podobne.

func handleTap(_ recognizer: UITapGestureRecognizer) { 
    // Perform operation 
} 
+0

Idealne rozwiązanie! –

1

Możesz przechwytywać wszelkiego rodzaju gesty w UIscrollView. Upewnij się, że obsługujesz niektóre z domyślnych właściwości, jak np. Ustaw właściwość cancelsTouchesInView na false, domyślnie jest to prawda. Podaj także numery identyfikatorów do widoków podrzędnych, aby odróżnić je w selektorach. & umożliwiają także ich interakcję z użytkownikiem na wartość true.

let tap = UITapGestureRecognizer (cel: samodzielne działanie:

selektor (didTapByUser (_ :)))

1

ten pracował dla mnie w Swift 3/Xcode 8

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **) 
    self.scrollView.canCancelContentTouches = false 

Powodzenia!

+0

Zamiast pozostawiać tę informację w komentarzu, proszę [edytuj] odpowiedź i dodaj ją bezpośrednio, a następnie usuń komentarz. Możesz również skorzystać z okazji, aby naprawić wcięcie (formatowanie kodu za pomocą Markdown wymaga 4 spacji, ale masz 8, co powoduje niepotrzebny dodatkowy poziom wcięcia). Dziękuję Ci! –

Powiązane problemy