Donc, tout ce que je veux faire est de jouer un son lorsque l'utilisateur touche un Uiscrollview. L'UISCrollViewelegate a cette méthode ScrollViewWillBEGINGRUGGE: mais elle s'appelle uniquement sur TouchMoved. Je veux que cela soit appelé sur Touchbegan. P>
Essayé Touchesbegan: Sans remarques: mais cela ne reçoit aucune touche. Quiconque a un indice? P>
8 Réponses :
Je pense que vous devrez devoir Sous-classe Uiscrollview pour pouvoir faire cela. P>
touchesbegan: Withevent: est seulement envoyé aux sous-classes d'UIView. Vous êtes problématiquement implémentant TouchSbegan: Sans: dans votre contrôleur, non? Si oui, cela ne fonctionnera pas de là ... P>
Alternativement, si vous mettez une sous-classe d'UIView (que vous avez écrite) dans votre Uiscrollview, vous pouvez également attraper l'événement TouchSbegan à partir de là (mais uniquement lorsque l'utilisateur touche cette sous-Signifie). UISCrollView passe sur les touches de ses sous-visions par défaut (voir TouchShouldbegin: Withevent: incontentview: dans UiscrollView). P>
Vous devriez ajouter TouchSbegan: SortEvent: sur votre Uiscrollview, pas sur l'Uiscrollviewdelegate. UiscrollView est une sous-classe d'uiresponder, qui a les événements tactiles. P>
Et si le uiscrollview code> est b> le
uiscrollviewelegate code>?
Vous pouvez également répondre à ces événements de votre contrôleur. Pour que cela fonctionne, vous devez définir cette fonctionnalité (dans votre contrôleur): puis, dans "ViewDidAppEar", vous devez appeler «DevenFirStreponder»: P> - (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self becomeFirstResponder];
nouvelles mises à jour sur le problème ici (y compris un lien vers ZoomScrollView Code source + une excellente explication sur UiscrollView Internals). En outre, consultez les Exemple Scrollviewsuite . P >
Utilisez un reconnaissance de gestes de robinet à la place:
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touch)]; [recognizer setNumberOfTapsRequired:1]; [recognizer setNumberOfTouchesRequired:1]; [scrollView addGestureRecognizer:recognizer];
OK, cela fonctionne, mais comment devrais-je déclarer la méthode "toucher" pour recevoir l'endroit où l'utilisateur a touché?
@HERNANARBRE Par exemple: Stackoverflow.com/questions/8721864/ ...
Utilisez un reconnaissance de gestes de robinet à la place:
-(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]; } }
@ Rajneesh071 Où manipulez-vous le booléen "traînant"? Est-ce automatiquement traité lorsque le sous-classement UiscorllView code>?
@ jet.chanchawat mec sa sous-classe de votre Uiscrollview et glisser est une propriété booléenne de Uiscrollview
Rajneesh071 Réponse à Swift 4 Strong>
Modifiez la classe personnalisée de ScrollView dans Storyboard vers CentremencierView CODE>
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)
}
}
}
Vous devez faire défiler la vue de la sous-classe, puis implémenter la méthode TouchSbegan.Vous avez également besoin de définir la propriété FaireTouchdown à False. P>