2009-11-06 13 views
10

Więc wszystko, co chcę zrobić, to odtworzyć dźwięk, gdy użytkownik dotknie UIScrollView. UIScrollViewDelegate ma tę metodę scrollViewWillBeginDragging: ale wywołuje się ją tylko w touchMoved. Chcę, żeby został wywołany TouchBegan.UIScrollView touchesBegan

Dotknięte dotknięcia: BEGAN: withEvent: ale nie otrzymuje żadnego dotyku. Ktoś ma jakąś wskazówkę?

Odpowiedz

6

Myślę, że będziesz musiał wykonać podklasę UIScrollView, aby móc to zrobić.

touchesBegan: withEvent: jest wysyłany tylko do podklas UIView. Prawdopodobnie wdrażasz touchesBegan: withEvent: w kontrolerze, prawda? Jeśli tak, to nie będzie działać stamtąd ...

Alternatywnie, jeśli umieścisz podklasę UIView (którą napisałeś) w swoim UIScrollView, możesz także złapać stamtąd touchesBegan (ale tylko wtedy, gdy użytkownik dotyka tego szczególnego wydziału). Program UIScrollView domyślnie przekazuje dotacje do swoich subviews (zobacz touchesShouldBegin: withEvent: inContentView: in UIScrollView).

0

Powinieneś dodać touchesBegan: withEvent: na swoim UIScrollView, a nie na UIScrollViewDelegate. UIScrollView jest podklasą UIResponder, która ma zdarzenia dotyku.

+0

Co jeśli 'UIScrollView' ** JEST **' UIScrollViewDelegate'? – aleclarson

5

Możesz również odpowiedzieć na te zdarzenia w kontrolerze. Do tego, aby pracować, trzeba zdefiniować tę funkcję (w kontrolerze):

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

Następnie w „viewDidAppear”, trzeba zadzwonić „becomeFirstResponder”:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self becomeFirstResponder]; 
1

nowe aktualizacje na wydanie here (w tym link do kodu źródłowego ZoomScrollView + doskonałe wyjaśnienie na temat elementów wewnętrznych UIScrollView). Zobacz także zaktualizowany przykład Apple'a o wersji ScrollViewSuite.

+2

Przykład ScrollViewSuite jest ogromny !!! Mam na myśli krwawe 74 MB! : O – tipycalFlow

13

Użyj Tap Gesture Rozpoznawanie zamiast:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch)]; 
[recognizer setNumberOfTapsRequired:1]; 
[recognizer setNumberOfTouchesRequired:1]; 
[scrollView addGestureRecognizer:recognizer]; 
+0

OK, to działa, ale jak powinienem zadeklarować metodę "dotknij", aby otrzymać miejsce, w którym użytkownik dotknął? –

+0

@HernanArber Na przykład: http: // stackoverflow.com/questions/8721864/get-screen-coordinates-from-uilongpressgesturerecognizer – Roosevelt

18

Użyj Tap Gesture Rozpoznawanie zamiast:

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch)]; 
[recognizer setNumberOfTapsRequired:1]; 
[recognizer setNumberOfTouchesRequired:1]; 
[scrollView addGestureRecognizer:recognizer]; 

Albo

make podklasy swojej UIScrollView i wdrożenia wszystkich

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 

// If not dragging, send event to next responder 
    if (!self.dragging){ 
    [self.nextResponder touchesBegan: touches withEvent:event]; 
    } 
    else{ 
    [super touchesEnded: touches withEvent: event]; 
    } 
} 
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 

// If not dragging, send event to next responder 
    if (!self.dragging){ 
    [self.nextResponder touchesBegan: touches withEvent:event]; 
    } 
    else{ 
    [super touchesEnded: touches withEvent: event]; 
    } 
} 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 

    // If not dragging, send event to next responder 
    if (!self.dragging){ 
    [self.nextResponder touchesBegan: touches withEvent:event]; 
    } 
    else{ 
    [super touchesEnded: touches withEvent: event]; 
    } 
} 
+1

Dodałem twój kod jako kategorię zamiast podklasy, i zadziałało ... –

+0

@ Rajneesh071 gdzie zajmujesz się boolowskim "przeciąganiem"? jest automatycznie obsługiwany podczas podklasy 'UIScorllView'? –

+0

@ jeet.chanchawat Dude jego subClass swojego UIScrollView, a przeciąganie jest właściwością boolean UIScrollView – Rajneesh071

0

Rajneesh071 odpowiedź w szybkim 4 Zmian klasa zwyczaj Scrollview w serii ujęć do CustomScrollView

import Foundation 

class CustomScrollView: UIScrollView { 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if !isDragging { 
      next?.touchesBegan(touches, with: event) 
     } else { 
     super.touchesBegan(touches, with: event) 
     } 
    } 
} 
0

musisz podklasy widoku przewijania, a następnie wdrożyć touchesBegan method.You należy również ustawić właściwość delayTouchDown false.