Comment faire un superview bouton d'interception des événements tactiles?
Dire que j'ai ce code:
#import <UIKit/UIKit.h>
@interface MyView : UIView
@end
@implementation MyView
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//How can I get this to show up even when the button is touched?
NSLog(@"%@", [touches anyObject]);
}
@end
@interface TestViewAppDelegate : NSObject <UIApplicationDelegate>
{
UIWindow *window;
}
@end
@implementation TestViewAppDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MyView *view = [[MyView alloc] initWithFrame:[window frame]];
[view setBackgroundColor:[UIColor whiteColor]];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Hiya!" forState:UIControlStateNormal];
[button setFrame:CGRectMake(100.0, 100.0, 200.0, 200.0)];
[view addSubview:button];
[window addSubview:view];
[window makeKeyAndVisible];
}
- (void)dealloc
{
[window release];
[super dealloc];
}
@end
Est-il possible d'intercepter les événements tactiles envoyés au bouton? Ce que j'aimerais éventuellement faire est de faire une sous-classe UIView que va dire son point de vue contrôleur (ou de son délégué, selon) lorsqu'il détecte un balayage, de sorte qu'il peut "pousser" le côté-vue-contrôleur sur la pile (similaire à l'écran d'accueil iPhone). J'ai pensé que c'était la première étape, mais je suis ouvert aux suggestions si j'aborde cette question de façon incorrecte.
Vous devez vous connecter pour publier un commentaire.
Je serais curieux de voir d'autres solutions, mais la meilleure façon que je connaisse est de remplacer l'une de ces deux UIView méthodes:
Ces méthodes appelée à déterminer si la touche est dans les limites de la vue ou l'un quelconque de ses sous-vues, donc c'est un bon point pour intercepter le toucher et de le passer sur. Il suffit de faire ce que vous voulez, et puis
ou
super
est juste parce que vous aurez envie d'appeler les classes de parents de la classe de la méthode,superview
serait ignorer cette.Réflexe serait de dire "sous-classe UIButton", mais UIButton est en fait une classe de cluster (c'est à dire, le type réel de l'objet de manière transparente en fonction des changements de ce type de bouton que vous voulez faire), ce qui le rend extrêmement difficile à la sous-classe. Court de réécriture UIButton, il n'y a pas beaucoup que vous pouvez faire sur cette approche.
Quand j'ai besoin de résoudre à peu près la même problème, je suis venu avec une vue qui utilise la composition pour afficher un proxy UIView, mais permettent tout de même de toucher l'interception. Voici comment cela fonctionne:
L'idée de base est que vous êtes intégrer le bouton (ou autre) dans une classe de conteneur (similaire à ce que vous avez décrit dans votre question). Cependant, vous êtes à la désactivation de l'interaction sur le bouton, ce qui signifie que lorsqu'un utilisateur appuie sur le bouton, appuyez sur un événement va "tomber à travers" le bouton et dans les boutons contenant superview (en cela, vos Mavue exemple). À partir de là, vous pouvez traiter la touche appropriée. Si vous souhaitez que le bouton "répondre" au toucher, juste permettre le bouton pour envoyer le approprié UIResponder message. (Vous pourrait besoin de ré-activer userInteractionEnabled sur le visibleView tout d'abord, cependant. Je ne suis pas sûr de ça).
Comme je l'ai dit ci-dessus, j'ai utilisé cette méthode (pas cette exacte de mise en œuvre, mais ce modèle) avec un certain succès, quand j'ai besoin d'avoir un bouton sur l'interface, mais aussi de capter le UITouch objet lui-même.
Puis-je suggérer l'utilisation de cette approche à la place:
Vous pouvez le faire à partir de la superview, pas besoin de faire les éléments d'INTERFACE utilisateur personnalisés.
Merci pour les suggestions et réponses instructives. J'ai fini juste à l'aide de l'explication illustré sur cette page: (sous la rubrique "Astuce 1: l'Émulation application Photos de glisser/zoom/défilement avec un seul UIScrollView").
Je crois que vous avez à la sous-classe UIButton dans ce cas, et de remplacer les réponses à UIResponder et toucher les événements de mouvement. Vous pouvez ensuite les transférer à n'importe quel objet que vous avez voulu en supposant que le UIButton sous-classe pourrait l'obtenir.
Dans ce cas, vous devez passer à l'superview de la UIButton.
Voir UIResponder documentation