J'ai une vue superposée sur de nombreuses autres vues. J'utilise seulement le overaly pour détecter un certain nombre de touches sur l'écran, mais à part ça je ne veux pas que la vue arrête le comportement des autres vues en dessous, qui sont scrollviews, etc. Comment puis-je transmettre toutes les touches à travers cette vue de superposition? C'est un sous-ensemble de UIView.iOS - transférer toutes les touches à travers une vue
Répondre
Essayez quelque chose comme ça ...
for (UIView *view in subviews)
[view touchesBegan:touches withEvent:event];
Le code ci-dessus, dans votre méthode de touchesBegan par exemple passeraient la touche à tous les sous-vues de vue.
Si la vue que vous souhaitez transférer la touche à ne pas arriver à être un sous-vue/superview, vous pouvez configurer une propriété personnalisée dans votre sous-classe UIView comme ceci:
@interface SomeViewSubclass : UIView {
id forwardableTouchee;
}
@property (retain) id forwardableTouchee;
Assurez-vous de faire la synthèse dans votre .m:
@synthesize forwardableTouchee;
Et puis inclure ce qui suit dans l'un de vos méthodes de UIResponder telles que:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.forwardableTouchee touchesBegan:touches withEvent:event];
}
Où que vous instanciez votre UIView, définissez la propriété forwardableTouchee à quelque vue que vous souhaitez les événements à transmettre à:
SomeViewSubclass *view = [[[SomeViewSubclass alloc] initWithFrame:someRect] autorelease];
view.forwardableTouchee = someOtherView;
Pour passer des touches d'une vue de superposition des vues en dessous, mettre en œuvre la méthode suivante le UIView:
Objective-C:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
NSLog(@"Passing all touches to the next view (if any), in the view stack.");
return NO;
}
Swift:
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
print("Passing all touches to the next view (if any), in the view stack.")
return false
}
J'ai le même problème, mais ce que je veux, c'est que si je suis en train de zoomer/tourner/déplacer la vue avec le geste, il devrait retourner oui et pour l'événement de repos il devrait retourner non, comment puis-je y arriver? – Minakshi
myWebView.userInteractionEnabled = NO;
était tout ce dont j'avais besoin!
Ceci est un ancien fil, mais il est venu sur une recherche, alors j'ai pensé que j'ajouterais mon 2c. J'ai un UIView de couverture avec des sous-vues, et que vous souhaitez que d'intercepter les touches qui ont frappé l'un des sous-vues, donc je modifié la réponse de PixelCloudSt à
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
for (UIView* subview in self.subviews) {
if ([subview hitTest:[self convertPoint:point toView:subview] withEvent:event] != nil) {
return YES;
}
}
return NO;
}
Vous devez créer une sous-classe UIView personnalisée (ou une sous-classe de toute autre sous-classe UIView telle que UIImageView ou autre) et remplacer cette fonction. En substance, la sous-classe peut avoir une '@interface' entièrement vide dans le fichier .h, et la fonction ci-dessus doit être le contenu entier de '@implementation'. – fresidue
Comme suggéré par @PixelCloudStv si vous voulez jeter touché d'une vue à une autre, mais avec un contrôle supplémentaire sur ce processus - sous-classe UIView
// tête
@interface TouchView : UIView
@property (assign, nonatomic) CGRect activeRect;
@end
// mise en œuvre
AprèsAprès dans interfaceBuilder, il suffit de définir la classe de View à TouchView et de définir rect rect actif avec votre rect. Vous pouvez également changer et implémenter une autre logique.
J'ai eu un problème similaire avec un UIStackView (mais pourrait être n'importe quelle autre vue). Ma configuration est la suivante:
Il est un cas classique où j'ai un conteneur qui devait être placé en arrière-plan, avec des boutons sur le côté. Pour la mise en page, j'ai inclus les boutons dans un UIStackView, mais maintenant la partie centrale (vide) du stackView intercepte les touches :-(
Ce que j'ai fait est de créer une sous-classe de UIStackView avec une propriété définissant le subView qui devrait être touchable Maintenant, tout toucher sur les boutons latéraux (inclus dans le tableau * viewsWithActiveTouch *) sera donné aux boutons, tandis que tout toucher sur la pileview ailleurs que dans ces vues ne sera pas intercepté, et donc transmis à tout ce qui est sous la vue de la pile.
/** Subclass of UIStackView that does not accept touches, except for specific subviews given in the viewsWithActiveTouch array */
class NoTouchStackView: UIStackView {
var viewsWithActiveTouch: [UIView]?
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
if let activeViews = viewsWithActiveTouch {
for view in activeViews {
if CGRectContainsPoint(view.frame, point) {
return view
}
}
}
return nil
}
}
version améliorée de réponse @fresidue. Vous pouvez utiliser cette sous-classe UIView
en vue transparente passant des touches òû côté de sa sous-vue. La mise en œuvre dans Objective-C:
@interface PassthroughView : UIView
@end
@implementation PassthroughView
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
for (UIView *view in self.subviews) {
if (!view.hidden && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) {
return YES;
}
}
return NO;
}
@end
et Swift:
class PassthroughView: UIView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return subviews.contains(where: {
!$0.isHidden && $0.point(inside: self.convert(point, to: $0), with: event)
})
}
}
- 1. Transférer des touches dans GTK
- 2. Comment créer une vue qui persiste à travers toutes les autres vues et contrôleurs?
- 3. Détermination de la touche tactile affectée à toutes les touches
- 4. Comment transférer en toute sécurité une référence à un objet à travers une fenêtre?
- 5. Itérer sur toutes les touches d'une carte
- 6. Obtenir toutes les touches enfoncées partout
- 7. Faire un champ monotones à travers toutes les lignes
- 8. invalide session à travers toutes les applications dans weblogic 11g
- 9. Touches de manipulation sur une vue d'image
- 10. rails façon de transférer l'objet polymorphe à travers l'URL
- 11. méthodes d'appel à travers les contrôleurs de vue
- 12. Servir des fichiers statiques à travers une vue dans Django
- 13. Comment transférer toutes les tables entre les bases de données à l'aide de SQL Management Studio?
- 14. Transférer des variables à une classe externe
- 15. boucle à travers toutes les lignes et les colonnes d'un gridview en utilisant C#
- 16. iOS - UIDocumentInteractionController et l'ajout d'une vue
- 17. longueur de la colonne à travers toutes les tables dans une base de données MySQL
- 18. Vous cherchez une liste de toutes les langues disponibles dans iOS
- 19. Android gérer toutes les touches d'entrée un événement tactile
- 20. Créer une vue, afficher toutes les places non réservées
- 21. enregistrer les données à plist à travers plusieurs vues
- 22. ajouter une vue de superposition sur toutes les autres vues
- 23. Transférer une exigence jQuery NotifyBar à la vue suivante dans une RedirectToAction
- 24. iPhone/iOS SDK: autorotate vue principale, mais pas vue enfant?
- 25. comment mettre à jour une vue toutes les cinq minutes dans les rails
- 26. Comment faire pour migrer toutes les URL dans les propriétés svn: externals à travers un référentiel?
- 27. (toutes les) directions perpendiculaires à l'hyperplan à travers p points de données
- 28. Itérer à travers une structure?
- 29. Comment rendre les données du modèle accessibles à travers toutes les méthodes du contrôleur efficacement?
- 30. cartes à jouer iOS
Le problème avec ce AFAIK approche est que tenter de transmettre des touches aux classes de cadre UIKit aura le plus souvent pas effet. Selon la documentation d'Apple, les classes d'infrastructure UIKit ne sont pas conçues pour recevoir des contacts dont la propriété view est définie sur une autre vue. Donc, cette approche fonctionne principalement pour les sous-classes personnalisées de UIView. – maciejs