web-dev-qa-db-fra.com

UITapGestureRecognizer ne fonctionne pas dans UIImageView

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.

22
xonegirlz
UITapGestureRecognizer *oneTouch=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(OneTouchHandeler)];

[oneTouch setNumberOfTouchesRequired:1];

[imageView addGestureRecognizer:oneTouch];

imageView.userInteractionEnabled = YES;
49
user1503512

Vous devez activer l'interaction utilisateur pour l'objet UIImageView:

[self.storyImageView_ setUserInteractionEnabled:YES];

MODIFIER:

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>

71
Kjuly

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.

9
Radif Sharafullin

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;
4
Carina

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
}()
3
quantdaddy

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
1
dahiya_boy

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
}
0
Emre Gürses

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;

0
dopcn