Pourquoi ne UINavigationBar voler les événements tactiles?
J'ai un custom UIButton avec UILabel ajoutée en tant que sous-vue. Bouton effectuer sélecteur de donnée que lorsque je le touche sur 15points plus faible du top lié. Et quand je me tape au-dessus de cette zone, rien ne se passe.
J'ai trouvé qu'il n'a pas causé par des erreurs de création de bouton et étiquette, car après je shift la touche inférieure à environ 15 px il fonctionne correctement.
Mise à JOUR j'ai oublié de dire que le bouton situé sous la UINavigationBar et 1/3 de la partie supérieure du bouton n'obtenez pas les événements tactiles.
Vue avec 4 boutons se trouve sous le NavigationBar. Et quand de toucher le "Basket-ball" en haut, BackButton obtenir de l'événement de touche, et quand touch "Piano" en haut, puis rightBarButton (s'il existe) obtenir touch. Si n'existe pas, rien ne s'est passé.
Je n'ai pas trouvé cette fonctionnalité documentée dans l'Application docs.
Aussi j'ai trouvé cette sujet lié à mon problème, mais il n'y a pas de réponse trop.
OriginalL'auteur Alexander | 2012-01-31
Vous devez vous connecter pour publier un commentaire.
J'ai remarqué que si vous définissez userInteractionEnabled OFF, le NavigationBar ne pas "voler" le touche plus.
De sorte que vous avez à la sous-classe votre UINavigationBar et dans votre CustomNavigationBar ce faire:
Informations sur la façon de la sous-classe UINavigationBar vous pouvez trouver ici.
La désactivation de l'interaction de l'utilisateur semble fonctionner sur le périphérique pour moi. Je suis en essais avec un iPhone 5 et iOS 6.1.2. Sous-classement n'est pas nécessaire; vous pouvez simplement désactiver l'interaction de l'utilisateur externe.
Cette solution a provoqué un bug pour moi et où, parfois, lors de la navigation de retour seulement la barre de navigation animé en arrière, mais la vue n'était pas retiré ou est devenu noir.
encore fonctionne sous ios 8.4 aujourd'hui!
ne fonctionne pas sous iOS 9
OriginalL'auteur Andrei R.
J'ai trouvé la réponse ici(Apple Developer Forum).
Keith à des Développeurs d'Apple Support Technique, le 18 Mai 2010 (iPhone OS 3):
Aussi j'ai découvert que lorsque je touche l'aire sous la UINavigationBar, l'emplacement.y définie comme 64,bien qu'il ne l'était pas.
J'ai donc fait ceci:
CustomWindow.h
CustomWindow.m
Dans AppDelegate classe j'utilise CustomWindow au lieu de UIWindow.
Maintenant, quand je touche l'aire sous la barre de navigation, il ne se passe rien.
Mes boutons ne comprends toujours pas les événements tactiles,parce que je ne sais pas comment envoyer de cet événement (et de modifier les coordonnées) à mon avis avec les boutons.
Peut-être que c'est ainsi. Je n'ai pas vérifié sur l'iPad. Et oui, c'est queerly.
Cela arrive même à l'extérieur du contenant de vue du contrôleur de limite (ma question). J'ai déposé ce que le radar 19504573.
La Pomme lien ne fonctionne pas. Est-il un autre lien à l'actif de la documentation d'Apple, ce qui lui donne des conseils? Je n'ai pas trouvé dans le HIG.
il fonctionne pour les gens avec un compte de développeur. Crédit à la citation est donnée à Keith à partir de l'Apple Developer Support Technique.
OriginalL'auteur Alexander
Sous-classe UINavigationBar et ajouter cette méthode. Il sera la cause de robinets pour être passé à travers, sauf s'ils sont en tapant dans une sous-vue (comme un bouton).
Notamment, cela va tout casser non personnalisé
UIBarButtonitem
s dans votre barre de navigation, par exemple. le bouton retour.- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)événement { UIView *hitView = [super hitTest:point withEvent:event]; si ([hitView isKindOfClass:[UIControl classe]]) { return hitView; } else { return nil; } } @mxcl
OriginalL'auteur Bart Whiteley
Je voulais juste partager un autre candidat à la résolution de ce problème. Ce n'est pas un problème de conception, mais il était destiné à aider les utilisateurs à revenir ou à naviguer. Mais nous avons besoin de mettre les choses étroitement dans ou au-dessous de la barre de navigation et les choses semblent tristes.
D'abord, permet de regarder le code.
}
Vous pourriez être voir pourquoi suis-je en train de faire la deuxième touche de la manipulation. Il est de la recette de la solution.
Test de collision est appelé deux fois pour un appel. La première fois que le point réel sur la fenêtre est signalé. Tout se passe bien. Lors de la deuxième passe, ce qui se passe.
Si le système détecte une barre de navigation et le point de vie est d'environ 9 pixels en plus sur l'axe côté, il essaie de diminuer progressivement au-dessous de 44 points qui est l'endroit où la barre de navigation.
Prendre un coup d'oeil à l'écran pour être clair.
Theres un mécanisme qui permettra d'utiliser à proximité de la logique de la seconde passe de hittest. Si nous pouvons connaître sa deuxième passe, et ensuite appeler la super avec le premier coup d'essai. Le travail est accompli.
Le code ci-dessus n'est exacte.
OriginalL'auteur kandelvijaya
La solution pour moi a été la suivante:
Première:
Ajouter dans votre application (Il n'importe pas où vous entrez ce code), une extension pour
UINavigationBar
comme suit:Le code suivant, l'envoi d'une notification avec le point et le cas lorsque le
navigationBar
est mise à profit.Ensuite, dans votre vue-contrôleur, vous devez écouter cette notification en ajoutant cette ligne dans votre
viewDidLoad
:Alors vous avez besoin pour créer la méthode
tapNavigationBar
dans votre vue-contrôleur de la manière suivante:PD: N'oubliez pas de retirer l'observation dans le deinit comme suit:
Que c'est... C'est un peu 'difficile', mais c'est une bonne solution pour ne pas sous-classement et obtenir une notification à chaque fois que le
navigationBar
est mise à profit.OriginalL'auteur Kevin Bel
Il y a 2 choses qui pourraient être à l'origine des problèmes.
Avez-vous essayé
setUserInteractionEnabled:NO
pour l'étiquette.Deuxième chose est, je pense, le travail est en dehors de cela après l'ajout de l'étiquette sur le dessus de bouton, vous pouvez envoyer une étiquette de retour (il peut fonctionner, vous ne savez pas bien)
[button sendSubviewToBack:label];
S'il vous plaît laissez-moi savoir si le code fonctionne 🙂
OriginalL'auteur aksani56
Vos étiquettes sont énormes. Ils commencent à
{0,0}
(le coin en haut à gauche de la touche), s'étendre sur toute la largeur du bouton et d'une hauteur de la totalité de la vue. Vérifiez votreframe
de données et essayez de nouveau.Aussi, vous avez la possibilité d'utiliser le
UIButton
propriététitleLabel
. Peut-être que vous définissez le titre plus tard et il va en cette étiquette plutôt que votre propreUILabel
. Qui pourrait expliquer pourquoi le texte (appartenant à la touche), tandis que l'étiquette serait couvrant le reste du bouton (ne pas laisser les robinets passer).titleLabel
est une propriété en lecture seule, mais vous pouvez le personnaliser tout comme votre propre étiquette (sauf peut-être leframe
), y compris la couleur du texte, police, ombre, etc.OriginalL'auteur Mundi
Cela a résolu mon problème..
J'ai ajouté hitTest:withEvent: code de ma barre de navigation sous-classe..
OriginalL'auteur HDdeveloper
L'extension d'Alexandre solution:
L'étape 1. Sous-classe
UIWindow
Étape 2: Affecter
ChunyuWindow
instance deAppDelegate
InstanceÉtape 3: mettre en Œuvre
touchesEnded:widthEvent:
pourview
avec boutons, par exemple:Étape 4: appel
ChunyuWindow
'saddViewForTouchPriority
lorsque la vue nous nous soucions s'affiche, et l'appelremoveViewForTouchPriority
lorsque la vue disparaît ou dealloc, dans viewDidAppear/viewDidDisappear/dealloc de ViewControllers, donc _touchView dansChunyuWindow
est NULLE, et il est le même queUIWindow
, sans avoir d'effets secondaires.OriginalL'auteur wfxiang
Une autre solution qui a fonctionné pour moi, en fonction de la réponse fournie par Alexandar:
Au lieu de l'annulation de la
UIWindow
, vous pouvez simplement désactiver le logiciel de reconnaissance de geste responsable du "les imprécisions de la région" à laUINavigationBar
.Sauveur, la solution la plus simple, a lutté toute la journée pour cela, Merci à Chris.
Aussi ne fonctionne pas dans iOS 9 simulateur.
OriginalL'auteur Chris Villa
Donner une version d'extension selon Bart Whiteley. Pas besoin de sous-classe.
OriginalL'auteur Victor Choy