J'ai eu le code suivant:
UITapGestureRecognizer *showStoryTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showNewsStory:)];
[showStoryTapRecognizer setDelegate:self];
[self.storyImageView_ addGestureRecognizer:showStoryTapRecognizer];
[showStoryTapRecognizer release];
Ceci ne déclenche cependant pas le showNewsStory, pourquoi? J'ai activé userInteraction dans la vue de l'image.
UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];
[oneTouch setNumberOfTouchesRequired:1];
[imageView addGestureRecognizer:oneTouch];
imageView.userInteractionEnabled = YES;
Vous devez activer l'interaction utilisateur pour l'objet UIImageView
:
[self.storyImageView_ setUserInteractionEnabled:YES];
Essayez de retirer le
[showStoryTapRecognizer setDelegate:self];
Je ne pense pas que UITapGestureRecognizer
ait ses méthodes de délégation pour autant que je sache. </ Strike>
UIImageView
est la seule sous-classe de UIView
à l'intérieur de UIKit
pour laquelle l'interaction utilisateur est désactivée par défaut.
Peut-être que ... action:@selector(showNewsStory)
au lieu de action:@selector(showNewsStory:)
. Vérifiez-le. Y at-il une autre UITapGestureRecognizer
dans ce contrôleur? Essaye ça:
otherTapRecognizer.cancelsTouchesInView = NO;
J'ai également remarqué que, dans Swift3, si vous ajoutez un identificateur de mouvements qui recherche également la cible et que la cible est généralement self
, vous devez alors faire en sorte que UIView auquel vous ajoutez le dispositif de reconnaissance de gestes soit un lazy var
. Sinon, la reconnaissance de geste ne fonctionnera pas. Je pense que c'est un bug dans Swift3. Idéalement, si vous accédez à self dans une variable avant que la classe ne soit complètement initialisée, une erreur devrait être générée. Le code ci-dessous ne détectera pas la reconnaissance de geste.
let messageImageView: CachedImageView = {
let iv = CachedImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
iv.layer.cornerRadius = 16
iv.layer.masksToBounds = true
iv.contentMode = .scaleAspectFill
iv.isUserInteractionEnabled = true
let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
zoomTap.numberOfTapsRequired = 1
iv.addGestureRecognizer(zoomTap)
return iv
}()
Pour résoudre ce problème, vous devez utiliser lazy var
lazy var messageImageView: CachedImageView = {
let iv = CachedImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
iv.layer.cornerRadius = 16
iv.layer.masksToBounds = true
iv.contentMode = .scaleAspectFill
iv.isUserInteractionEnabled = true
let zoomTap = UITapGestureRecognizer(target: self, action: #selector(handleZoomTap))
zoomTap.numberOfTapsRequired = 1
iv.addGestureRecognizer(zoomTap)
return iv
}()
objective-c ios 10
UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];
[oneTouch setNumberOfTouchesRequired:1];
[imageView addGestureRecognizer:oneTouch];
imageView.userInteractionEnabled = YES;
// Swift 3.0
let oneTouch = UITapGestureRecognizer(target: self, action: #selector(self.OneTouchHandeler(_:)))
imageView.addGestureRecognizer(oneTouch)
imageView.isUserInteractionEnabled = true
si vous avez autorisé 2 gestes différents, vous devez ajouter un extrait de code ci-dessous. Par exemple, vous utilisez pickerView et souhaitez également détecter le geste de toucher pour le même pickerView.
Demande au délégué si deux identificateurs de geste devraient être autorisés à reconnaître des gestes simultanément.
Objectif c
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return true;
}
Rapide
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
Si vous avez déjà défini imageView.userInteractionEnabled = YES;
mais que l'action ne soit toujours pas déclenchée. Peut-être est-ce parce que pour l'une des supervisions de imageView userInteractionEnabled, c'est NO;