2009-11-06 6 views
10

Alors tout ce que je veux faire est de jouer un son lorsque l'utilisateur touche un UIScrollView. UIScrollViewDelegate a cette méthode scrollViewWillBeginDragging: mais elle est seulement appelée sur touchMoved. Je veux qu'il soit appelé sur TouchBegan.UIScrollView touchesBegan

Touché touchBegan: withEvent: mais il ne reçoit aucune touche. Quelqu'un a une idée?

Répondre

6

Je pense que vous devrez sous-classer UIScrollView pour pouvoir faire ceci.

touchesBegan: withEvent: est uniquement envoyé aux sous-classes de UIView. Vous mettez problablement en œuvre touchesBegan: withEvent: dans votre contrôleur, non? Si c'est le cas, cela ne fonctionnera pas à partir de là ...

Alternativement, si vous mettez une sous-classe de UIView (que vous avez écrite) dans votre UIScrollView, vous pouvez également attraper l'événement touchesBegan à partir de là (mais seulement quand l'utilisateur touche cette sous-vue particulière). UIScrollView transmet les touches à ses sous-vues par défaut (voir touchesShouldBegin: withEvent: inContentView: dans UIScrollView).

0

Vous devez ajouter touchesBegan: withEvent: sur votre UIScrollView, pas sur UIScrollViewDelegate. UIScrollView est une sous-classe de UIResponder, qui possède les événements tactiles.

+0

Et si le 'UIScrollView' ** EST ** le' UIScrollViewDelegate'? – aleclarson

5

Vous pouvez également répondre à ces événements dans votre automate. Pour que cela fonctionne, vous devez définir cette fonction (dans votre contrôleur):

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

Puis, dans « viewDidAppear », vous devez appeler « becomeFirstResponder »:

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

nouvelles mises à jour sur le question here (y compris un lien vers le code source ZoomScrollView + une excellente explication sur les internes UIScrollView). Consultez également l'exemple mis à jour ScrollViewSuite d'Apple.

+2

L'exemple ScrollViewSuite est énorme !!! Je veux dire sanglant 74 MB! : O – tipycalFlow

13

Utilisez un robinet Gesture Recognizer à la place:

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

Ok, cela fonctionne, mais comment dois-je déclarer la méthode "toucher" pour recevoir l'endroit où l'utilisateur a touché? –

+0

@HernanArber Par exemple: http: // stackoverflow.com/questions/8721864/get-screen-coordinates-from-uilongpressgesturerecognizer – Roosevelt

18

Utilisez un robinet Gesture Recognizer à la place:

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

Ou

faire subClass de votre UIScrollView et mettre en œuvre tous les

-(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

J'ai ajouté votre code en tant que catégorie au lieu de sous-classe, et cela a fonctionné ... –

+0

@ Rajneesh071 où gérez-vous le booléen "dragging"? est-il géré automatiquement lors du sous-classement de 'UIScorllView'? –

+0

@ jeet.chanchawat Dude sa sous-classe de votre UIScrollView, et en faisant glisser est une propriété booléenne de UIScrollView – Rajneesh071

0

Rajneesh071 réponse rapide 4 Modifier la classe personnalisée de ScrollView en story-board à 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

Vous devez sous défilante, puis mettre en œuvre le touchesBegan method.You besoin de définir également la propriété delayTouchDown false.