UIView, son superview et touchesBegan:
Supposons que j'ai un UIViewController sous-classe qui prend soin de certains UIViews. Ces UIViews sont ajoutés comme des sous-vues de la UIViewController de view
la propriété):
UIViewController:
- (void)viewDidLoad {
UIImageView *smallImageView...
[self.view addSubview:smallImageView];
UIButton *button..
[self.view addSubview:button];
UIView *bigUIView.. //covers the entire screen (frame = (0.0, 0.0, 1024.0, 768.0))
[self.view addSubview:bigUIView];
...
}
Autant que je sache, depuis le bigUIView
est la première vue et couvre la totalité de l'écran, il recevra le touchesBegan:withEvent:
et les autres points de vue, comme button
ne recevront pas d'événement tactile.
Dans mon application bigUIView
doit être le plus haut, car il possède l'un des principaux objets de l'interface utilisateur (CALayers, en fait, les principaux objets du jeu) que, lors de l'animation, doit être au-dessus de tous les autres sous-éléments de l'INTERFACE utilisateur (UIButtons, etc). Cependant, j'aimerais être en mesure d'avoir encore la UIButtons et d'autres objets dans le Répondeur de la Chaîne.
J'ai essayé la mise en œuvre de la suite dans les bigUIView
classe:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.superview touchesBegan:touches withEvent:event];
... hit test the touch for this specific uiview..
}
Notes:
bigUIView
's superview se réfère à la UIViewController deview
de la propriété, est-il propager l'événement de touche à l'ensemble de sous-vues?bigUIView
doit avoiruserInteractionEnabled = YES
car il gère également la saisie de l'utilisateur.- Je ne peux pas apporter la
button
/smallImageView
à l'avant parce qu'il apparaît ci-dessus les principaux objets du jeu (sous-couches debigUIView
).
Merci d'avance.
Vous devez vous connecter pour publier un commentaire.
Essayer primordial
pointInside:withEvent:
dans lebigUIView
classe pour retournerNO
si le point est à l'intérieur du rectangle de cadre de l'un de l'autre sous-vues de l'arrière-plan de la vue. Puisque c'est un frère ou d'une de ces autres points de vue, du coup le mécanisme de test vais continuer à tester les autres sous-vues et de trouver celle correspondant au point à l'utilisateur touché.Alos, envisager la mise en œuvre de la phase d'événement méthodes (
-touchesBegan:withEvent:
, etc.) dans votreUIViewController
sous-classe plutôt que dans lebigUIView
classe. iOS inserts de vue des contrôleurs derrière leurs points de vue dans le répondeur de la chaîne, de sorte que les messages d'événements vont remonter à la vue du contrôleur, à moins que l'un des autres sous-vues (par exemple, un bouton) intercepte. La vue contrôleur peut alors envoyer tout ce que les messages que vous aimez un quelconque de ses points de vue.pointInside:withEvent:
est la solution. En retournant PAS lorsque le point est à l'intérieur du rectangle de cadre de l'un de l'autre sous-vues cause de labigUIView
's-touchesBegan:withEvent:
méthode de ne pas être appelé et lebutton
'action qui a été déclenché. Notez que cette cause un couplage entre lesbigUIView
et labutton
. Comment intercepter les événements phase de méthodes que dans leUIViewController
lorsque lebigUIView
couvrir la totalité de l'écran? La création d'une autre signature de la méthode dansbigUIView
classe et ont été déléguées par le "catch all"UIViewController
classe?bigUIView
à tous. De cette façon, les messages seront envoyés le répondeur de la chaîne jusqu'à ce qu'ils atteignent un objet qui a un substituée mise en œuvre (par exempleUIButton
ou votre personnaliséUIViewController
sous-classe).bigUIView
instance peut appeler de la décision. De cette façon, le point de vue contrôleur est responsable pour le calcul de la vue qui reçoit le message et il n'y aurait pas de couplage à tous.bigUIView
besoins de la-touchesBegan:withEvent:
délégué des arguments de méthode fonctionne correctement? Primordial va provoquer le Répondeur de la Chaîne à être arrêté, ne vous suggérons de créer un autre événement de la phase 'frère' méthodes de signatures et de les mettre en œuvre dans lebigUIView
(ces méthodes serait appelé par leUIViewController
)?[super touchesBegan:withEvent:]
à la fin de chacune des méthodes de remplacement dansbigUIView
, ce qui permettrait de messages pour continuer sur le répondeur de la chaîne de sorte qu'ils seraient reçus par lebigUIView
et de son contrôleur.Normalement dans le répondeur de la chaîne, les événements sont des passes à superviews, de ne pas sous-vues. De toute façon, je voudrais convertir des points en événements pour le bouton du système de coordonnées local, et si elle frappe, envoyez une action du contrôleur.
bigUIView
(qui appartient à la "game package" (CALayers)) et les autres éléments de l'INTERFACE utilisateur (créé dans le IB). Merci