iPhone: Suivi / Identification des touches individuelles

voix
14

J'ai une petite question concernant les touches de suivi sur l'iPhone et je semble ne pas être en mesure de parvenir à une conclusion sur ce point, donc des suggestions / idées sont très appréciés:

Je veux être en mesure de suivre et d'identifier les touches sur l'iPhone, par exemple. essentiellement chaque touche a une position de départ et une position actuelle / DEPLACE. Les touches sont stockées dans un std :: vecteur et ils doivent être retirés du récipient, une fois qu'ils ont fini. Leur position est mise à jour une fois qu'ils se déplacent, mais je veux encore garder une trace de l'endroit où ils ont commencé d'abord (la reconnaissance des gestes).

Je reçois la touche de [de allTouches événement], chose est, le NSSet est non triés et je semble ne pas être en mesure d'identifier les touches qui sont déjà stockés dans le std :: vecteur et reportez-vous aux touches du NSSet (donc je savent ceux qui ont fini et doivent être enlevés ou ont été déplacés, etc.)

Voici mon code, qui fonctionne parfaitement avec un seul doigt sur l'écran tactile, bien sûr, mais avec plus d'un, je reçois des résultats imprévisibles ...

    - (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    [self handleTouches:[event allTouches]];
}

- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    [self handleTouches:[event allTouches]];
}

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    [self handleTouches:[event allTouches]];
}

- (void) touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
    [self handleTouches:[event allTouches]];
}

- (void) handleTouches:(NSSet*)allTouches
{   
    for(int i = 0; i < (int)[allTouches count]; ++i)
    {
        UITouch* touch = [[allTouches allObjects] objectAtIndex:i];
        NSTimeInterval timestamp = [touch timestamp];

        CGPoint currentLocation = [touch locationInView:self];
        CGPoint previousLocation = [touch previousLocationInView:self];

        if([touch phase] == UITouchPhaseBegan)
        {
            Finger finger;
            finger.start.x = currentLocation.x;
            finger.start.y = currentLocation.y;
            finger.end = finger.start;
            finger.hasMoved = false;
            finger.hasEnded = false;

            touchScreen->AddFinger(finger);
        }
        else if([touch phase] == UITouchPhaseEnded || [touch phase] == UITouchPhaseCancelled)
        {
            Finger& finger = touchScreen->GetFingerHandle(i);

            finger.hasEnded = true;
        }
        else if([touch phase] == UITouchPhaseMoved)
        {
            Finger& finger = touchScreen->GetFingerHandle(i);

            finger.end.x = currentLocation.x;
            finger.end.y = currentLocation.y;
            finger.hasMoved = true;
        }
    }

    touchScreen->RemoveEnded();
}

Merci!

Créé 26/05/2009 à 23:26
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Vous devriez être en mesure de rassembler correctement vos touches en stockant l'emplacement précédent de toutes les touches, puis on compare ces emplacements précédents lorsque de nouvelles touches sont détectées.

Dans votre -handleTouchesméthode, vous pouvez mettre quelque chose comme ça dans votre boucle:

// ..existing code..
CGPoint previousLocation = [touch previousLocationInView:self];

// Loop through previous touches
for (int j = 0; j < [previousTouchLocationArray count]; j++) {
  if (previousLocation == [previousTouchLocationArray objectAtIndex:j]) {
    // Current touch matches - retrieve from finger handle j and update position
  }
}

// If touch was not found, create a new Finger and associated entry 

Évidemment, vous aurez besoin de faire du travail à intégrer dans votre code, mais je suis assez sûr que vous pouvez utiliser cette idée d'identifier correctement des touches qui se déplacent à l'écran. Aussi je viens de réaliser CGPoint ne rentre pas bien dans un NSArray - vous aurez besoin d'envelopper ces objets dans NSValue (ou utiliser un type de tableau différent).

Créé 27/05/2009 à 00:40
source utilisateur

voix
7

Pour corriger la ferraille votre problème votre méthode « handleTouches ». La première chose que vous faites dans votre méthode handleTouches, est passer sur le touchPhase, mais qui est déjà donné à vous. Si vous recevez la touche dans touchesBegan, vous savez que le contact est en UITouchPhaseBegan. En canalisant des touches des quatre méthodes tactiles dans une méthode, vous défaisant le but d'avoir quatre méthodes de délégués.

Dans chacune de ces méthodes, Apple vous donne l'occasion de faire face à une autre phase de la touche actuelle.

La deuxième chose est que vous n'avez pas besoin de rechercher l'événement pour la touche actuelle, il vous est donné comme paramètre: touches.

Un événement est composé d'ensembles de touches. Pour convienence, vous donne la touche actuelle, même si elle peut aussi être trouvé dans l'événement.

Ainsi, dans touchesBegan, vous commencez à suivre une touche.

    - (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{


        NSString *startPoint = NSStringFromCGPoint([[touches anyObject] locationInView:self]);  

        NSDictionary * touchData = [NSDictionary dictionaryWithObjectsandKeys: startPoint, @"location", touches, @"touch"]

        [startingLocations addObject:touchData];

        }

J'utilise un tableau de dictionnaires pour contenir mes données tactiles.

Essayez de séparer votre code et le déplacer dans la méthode tactile appropriée. Pour la direction, Apple a un des exemples de projets de couple qui se concentrent sur des touches et vous montrer comment configurer ces méthodes.

Rappelez-vous, ces méthodes sera appelé automatiquement pour chaque touche au cours de chaque phase, vous n'avez pas besoin de faire défiler l'événement pour savoir ce qui est arrivé.

Le pointeur à chaque jeu de touches reste constante, seulement les changements de données.

En outre, je lirais la section guide de programmation iPhone OS sur la gestion des événements qui va plus en profondeur de ce que je l'ai dit ci-dessus avec plusieurs schémas expliquant la relation de touches à des événements au fil du temps.

Un extrait:

Dans iPhone OS, un objet UITouch représente une touche, et un objet UIEvent représente un événement. Un objet d'événement contient tous les objets tactiles pour la séquence multi-touch courant et peut fournir des objets de contact spécifique à un affichage ou de la fenêtre (voir figure 3-2). Un objet tactile est persistant pour un doigt donné au cours d'une séquence, et UIKit il mute comme il suit le doigt à travers elle. Les attributs contact que le changement est la phase du toucher, son emplacement dans une vue, son emplacement précédent, et son horodatage. le code de gestion d'événements évalue ces attributs pour déterminer comment répondre à l'événement.

Créé 27/05/2009 à 05:22
source utilisateur

voix
8

Il semble que la façon « correcte » pour suivre les multiples touches est par la valeur de pointeur de l'événement UITouch.

Vous trouverez plus de détails dans la section « Gestion d' un complexe séquence multi-touch » de cette pomme Developer Documentation

Créé 28/03/2010 à 08:18
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more