Message Hier à propos de la manipulation des robinets double a provoqué une question sur la façon de gérer deux robinets utilisant un UIWebView. Je n'ai pas beaucoup travaillé avec UIWebView, mais je pense qu'une petite explication de la façon dont la chaîne répondeur fonctionne sur l'iPhone peut aider, c'est un peu différent que la chaîne des intervenants sur Mac OS X.
Les contrôleurs sont désormais officiellement partie de la chaîne des intervenants. Tout événement va d'abord aux First Responder, Comme on pouvait s'y attendre.
Si les First Responder (Qui est généralement l'élément interface étant en interaction avec) ne consomme pas le cas, il n'est pas toujours transmis directement à la SuperView, comme il est sur OS X. Au contraire, la First Responder vérifie pour voir si elle a un contrôleur, et s'il y en a un, il ne une passe latérale vers elle. Cela donne la classe contrôleur la possibilité de répondre et / ou de consommer des événements avant qu'il ne soit passé à la SuperView. C'est pourquoi vous pouvez mettre en œuvre des méthodes comme touchesBegan: withEvent: soit sur une vue ou un contrôleur de vue.
Cela vous donne deux options si vous avez besoin pour intercepter des événements normalement gérés par un objet UIKit, comme le UIView: Vous pouvez mettre en œuvre les touchesBegan: withEvent: soit sur le contrôleur de l'objet, ou vous pouvez créer une sous-classe de l'objet et mettre en œuvre la méthode il ya .
Je ne sais pas ce qui doit être utilisé avec UIWebView parce que je ne sais pas si UIView consomme l'événement double tap. Je devine qu'il fait (je mettrai à jour si je reçois une confirmation de cela), donc je suppose que vous auriez à UIWebView sous-classe pour intercepter double robinets. Si elle ne consomme pas le cas, alors vous pouvez l'intercepter dans la classe de contrôleur pour l'affichage Web.
Voici l'astuce, si. Mettre en œuvre une méthode comme touchesBegan: withEvent, par défaut, consomme cette manifestation afin qu'elle ne va pas au travers de la chaîne Responder. Toutefois, si vous êtes d'intercepter un événement pour un contrôle qui détecte touche ou les gestes, alors vous devez vous assurer que vous passez l'événement de la chaîne intervenant manuellement si vous n'avez pas le manipuler complètement.
Voici comment vous pourriez intercepter un double-clic dans votre classe contrôleur, laissant tous les événements qui ne sont pas gérées par votre méthode de procéder bas e intervenant de la chaîne:
Lorsque sous-classes d'une vue existante que de toucher a un code de gestion, vous avez à gérer un peu différemment. Qu'est-ce que vous avez à faire à la place, est de faire passer l'événement non gérée à super, comme ceci:
Fondamentalement, si vous ne voulez pas consommer de l'événement, vous devez appeler manuellement la même méthode sur le prochain intervenant. C'est tout. C'est la magie qui vous permet d'intercepter certains, mais pas tous, des événements pour un objet existant. Donc, pour intercepter un double-clic dans une sous-classe de UIWebView, vous pourriez faire quelque chose comme ceci:
En-tête: MyUIViewSubclass.h
Mise en œuvre: MyUIViewSubclass.m
Note - ce n'est pas testé le code, mais il devrait vous donner une idée de comment le processus fonctionne. C'est le processus de base que vous utilisez n'importe quel moment vous avez besoin d'intercepter certains, mais pas tous, les événements de la chaîne des intervenants.
Les contrôleurs sont désormais officiellement partie de la chaîne des intervenants. Tout événement va d'abord aux First Responder, Comme on pouvait s'y attendre.
Si les First Responder (Qui est généralement l'élément interface étant en interaction avec) ne consomme pas le cas, il n'est pas toujours transmis directement à la SuperView, comme il est sur OS X. Au contraire, la First Responder vérifie pour voir si elle a un contrôleur, et s'il y en a un, il ne une passe latérale vers elle. Cela donne la classe contrôleur la possibilité de répondre et / ou de consommer des événements avant qu'il ne soit passé à la SuperView. C'est pourquoi vous pouvez mettre en œuvre des méthodes comme touchesBegan: withEvent: soit sur une vue ou un contrôleur de vue.
Cela vous donne deux options si vous avez besoin pour intercepter des événements normalement gérés par un objet UIKit, comme le UIView: Vous pouvez mettre en œuvre les touchesBegan: withEvent: soit sur le contrôleur de l'objet, ou vous pouvez créer une sous-classe de l'objet et mettre en œuvre la méthode il ya .
Je ne sais pas ce qui doit être utilisé avec UIWebView parce que je ne sais pas si UIView consomme l'événement double tap. Je devine qu'il fait (je mettrai à jour si je reçois une confirmation de cela), donc je suppose que vous auriez à UIWebView sous-classe pour intercepter double robinets. Si elle ne consomme pas le cas, alors vous pouvez l'intercepter dans la classe de contrôleur pour l'affichage Web.
Whoah - fait une petite erreur dans le premier affichage. Lorsque la mise en œuvre de ce code dans une classe de contrôleur, vous souhaitez transmettre à l'autre intervenant. Lorsque sous-classes d'une vue existante qui gère touche, vous voulez passer au super! J'ai corrigé le post ci-dessous pour refléter la différence
Voici l'astuce, si. Mettre en œuvre une méthode comme touchesBegan: withEvent, par défaut, consomme cette manifestation afin qu'elle ne va pas au travers de la chaîne Responder. Toutefois, si vous êtes d'intercepter un événement pour un contrôle qui détecte touche ou les gestes, alors vous devez vous assurer que vous passez l'événement de la chaîne intervenant manuellement si vous n'avez pas le manipuler complètement.
Voici comment vous pourriez intercepter un double-clic dans votre classe contrôleur, laissant tous les événements qui ne sont pas gérées par votre méthode de procéder bas e intervenant de la chaîne:
-(void)respondToFictionalEvent:(UIEvent *)event {
if (someCondition)
[self handleEvent:event];
else
[self.nextResponder respondToFictionalEvent:event];
}
Lorsque sous-classes d'une vue existante que de toucher a un code de gestion, vous avez à gérer un peu différemment. Qu'est-ce que vous avez à faire à la place, est de faire passer l'événement non gérée à super, comme ceci:
-(void)respondToFictionalEvent:(UIEvent *)event {
if (someCondition)
[self handleEvent:event];
else
[super respondToFictionalEvent:event];
}
Fondamentalement, si vous ne voulez pas consommer de l'événement, vous devez appeler manuellement la même méthode sur le prochain intervenant. C'est tout. C'est la magie qui vous permet d'intercepter certains, mais pas tous, des événements pour un objet existant. Donc, pour intercepter un double-clic dans une sous-classe de UIWebView, vous pourriez faire quelque chose comme ceci:
En-tête: MyUIViewSubclass.h
#import
@interface MyUIViewSubclass : UIView {
}
@end
Mise en œuvre: MyUIViewSubclass.m
#import "MyUIViewSubclass.h"
@implementation MyUIViewSubclass
- (void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
NSUInteger tapCount = [touch tapCount];
BOOL consumed = NO;
if (tapCount == 2) {
// Do whatever...
consumed = YES;
}
if (!consumed)
[super touchesBegan:touches withEvent:event];
}
@end
Note - ce n'est pas testé le code, mais il devrait vous donner une idée de comment le processus fonctionne. C'est le processus de base que vous utilisez n'importe quel moment vous avez besoin d'intercepter certains, mais pas tous, les événements de la chaîne des intervenants.
Aucun commentaire:
Enregistrer un commentaire