9
votes

Comment faire une touche MkannotationView Touch Sensible?

J'ai actuellement une vue cartographique avec une annotation dessus. J'ai l'annotation avec des images personnalisées. Le problème que j'essaie de résoudre est la sensibilité des images. Lorsque j'essaie de les faire glisser, on ressent que je dois toucher le centre exact pour qu'il soit concentré sur. Y a-t-il un moyen de rendre les limites tactiles plus grandes?


0 commentaires

4 Réponses :


0
votes

J'ai mis en œuvre quelque chose de similaire de la manière suivante

  1. Créer une sous-classe de la classe de reconnaissance de geste qui traite des touches
  2. Créez une sous-classe de la classe UIImage, cette classe utilise la classe de reconnaissance pour gérer vos gestes
  3. Utilisez ceci dans l'annotation

    La sous-classe de reconnaissance de gestes gérera vos gestes si vous les effectuez à tout moment de l'image. Cela devrait vous aider.

    Gardez-nous au courant de la question de savoir si cette solution a fonctionné pour vous ...


0 commentaires

1
votes

Avez-vous membre de la sous-classe MkannotationView ou avez-vous changé la propriété de l'image de l'image?

Voici la documentation pour définir la propriété Image.

Discussion: L'attribution d'une nouvelle image sur cette propriété modifie également la taille du cadre de la vue afin qu'elle correspond à la largeur et à la hauteur de la nouvelle image. La position du cadre de la vue ne change pas.

Vérifiez la taille du cadre de votre affichage d'annotation, qui est l'endroit où votre objet peut recevoir des touches.


0 commentaires

18
votes

Pour ce faire, vous devez sousclure mkannotationview code> pour créer votre propre mkannotationview code>. Dans votre sous-classe, remplacez les fonctions suivantes:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    UIView* hitView = [super hitTest:point withEvent:event];
    if (hitView != nil)
    {
        // ensure that the callout appears above all other views
        [self.superview bringSubviewToFront:self];

        // we tapped inside the callout
        if (CGRectContainsPoint(self.resultView.callButton.frame, point))
        {
            hitView = self.resultView.callButton;
        }
        else if (CGRectContainsPoint(self.resultView.addButton.frame, point))
        {
            hitView = self.resultView.addButton;
        }
        else
        {
            hitView = self.resultView.viewDetailsButton;
        }
        [self preventSelectionChange];
    }
    return hitView;
}


7 commentaires

Pourriez-vous mettre en œuvre la méthode Hittest s'il vous plaît?


Si je pouvais recommencer à voter votre réponse, je le ferais! Merci pour la mise à jour.


Salut à nouveau, que diriez-vous de Pointinide: Sans:? Est-ce là où vous proposez CGrectContainSpoint d'être mis en œuvre?


@Daniel Oui, vous pouvez également utiliser la même implémentation pour les deux méthodes afin de déterminer si le point doit être considéré comme «à l'intérieur» de votre annotation ou non. Toutefois, Pointinide: Windoppent est susceptible d'être beaucoup plus simple et de retourner simplement oui si le point est à l'intérieur de votre rectangle de vision ultime. La seule fois que vous auriez besoin de retourner non, c'est lorsque vous avez des zones transparentes qui devraient être considérées comme «à l'extérieur», même s'ils tombent dans le rectangle de liaison.


Je peux recevoir des événements de toucher sur mon bouton, mais Touchez-le à l'intérieur ne déclenche pas, la vue Carte semble capturer cela et traite de désélectionner l'annotation. Des pensées ?


Mettez en œuvre les deux méthodes et ils doivent être cohérents - c'est-à-dire si Pointinide renvoie Oui, alors Hittest doit renvoyer une vue valide. Si Pointinide revient non, je ne pense pas que Hittest soit même appelé. De plus, vous voudrez peut-être éviter la désélection, car les annotations par défaut permettent d'autres annotations qui sont sélectionnées pour être sélectionnées.


Pas pour moi! exemple plz.



0
votes

@jhabbott Solution n'a jamais travaillé pour moi, comme je l'ai mentionné ici .

J'ai une image et une étiquette cote à cote. L'image a été montrée en définissant l'annotationview image Image et l'étiquette en ajoutant un uilabel

J'ai redirigé le point de fonctionnement :) méthode sur uilabel un (qui incluait la zone d'image) et Hittest a renvoyé exactement la même vue si j'ai cliqué sur l'étiquette ou l'image. Mais label clic n'a produit pas de rappel ...

Enfin, j'ai fini par élargir le cadre MkannotationView pour joindre une étiquette + image, je définis annotationview.image sur nil , et j'ai créé mon uiImageView .

Parce que je voulais le point d'ancrage au milieu de l'image, je devais définir une personnalité: xxx

puis j'ai supprimé le point (à l'intérieur: avec :) et Hittest (point: avec :) des substituts qui n'ont rien fait.

et maintenant, pour la première fois, ma vue d'annotation est totalement réactive.


0 commentaires