web-dev-qa-db-fra.com

Comment obtenir un CGPoint à partir d'un emplacement exploité?

Je travaille sur une application de calculatrice graphique pour iPad et je voulais ajouter une fonctionnalité permettant à l'utilisateur de toucher une zone de la vue graphique pour créer une zone de texte affichant les coordonnées du point touché. Comment puis-je obtenir un CGPoint à partir de cela?

27
jkolber

vous avez deux voies ...

1.

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
  UITouch *touch = [[event allTouches] anyObject];
  CGPoint location = [touch locationInView:touch.view];
}

ici, vous pouvez obtenir la position avec le point de la vue actuelle ...

2.

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
[tapRecognizer setNumberOfTapsRequired:1];
[tapRecognizer setDelegate:self];
[self.view addGestureRecognizer:tapRecognizer];

ici, ce code utilise quand vous voulez faire quelque chose avec votre objet particulier ou sous-vue de votre mainview 

47
Paras Joshi

Essaye ça 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
  UITouch *touch = [touches anyObject];

  // Get the specific point that was touched
  CGPoint point = [touch locationInView:self.view]; 
  NSLog(@"X location: %f", point.x);
  NSLog(@"Y Location: %f",point.y);

}

Vous pouvez utiliser "touches effacées" si vous préférez voir où l'utilisateur a levé son doigt de l'écran au lieu de toucher l'endroit où il s'est touché.

20
Dima

il est probablement préférable et plus simple d’utiliser un UIGestureRecognizer avec la vue Carte au lieu d’essayer de le sous-classer et d’intercepter les contacts manuellement.

Étape 1: Ajoutez d’abord le logiciel de reconnaissance de mouvements à la vue Carte:

 UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(tapGestureHandler:)];
 tgr.delegate = self;  //also add <UIGestureRecognizerDelegate> to @interface
 [mapView addGestureRecognizer:tgr];

Étape 2: Ensuite, implémentez shouldRecognizeSimultaneousWithGestureRecognizer et renvoyez YES pour que votre outil de reconnaissance des gestes tactiles puisse fonctionner en même temps que celui de la carte (sinon, les taps sur les punaises ne seront pas automatiquement gérés par la carte):

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer
    :(UIGestureRecognizer *)otherGestureRecognizer
{
   return YES;
}

Étape 3: Enfin, implémentez le gestionnaire de gestes:

- (void)tapGestureHandler:(UITapGestureRecognizer *)tgr
{
   CGPoint touchPoint = [tgr locationInView:mapView];

   CLLocationCoordinate2D touchMapCoordinate 
    = [mapView convertPoint:touchPoint toCoordinateFromView:mapView];

   NSLog(@"tapGestureHandler: touchMapCoordinate = %f,%f", 
    touchMapCoordinate.latitude, touchMapCoordinate.longitude);
}
6
Kupendiran iOS

Je veux juste lancer un Swift 4 answer car l’API est très différente.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = event?.allTouches?.first {
        let loc:CGPoint = touch.location(in: touch.view)
        //insert your touch based code here
    }
}

OR

let tapGR = UITapGestureRecognizer(target: self, action: #selector(tapped))
view.addGestureRecognizer(tapGR)

@objc func tapped(gr:UITapGestureRecognizer) {
    let loc:CGPoint = gr.location(in: gr.view)  
    //insert your touch based code here
}

Dans les deux cas, loc contiendra le point qui a été touché dans la vue.

4
Rob Norback

Si vous utilisez un objet UIGestureRecognizer ou UITouch, vous pouvez utiliser la méthode locationInView: pour récupérer la CGPoint dans la vue donnée que l'utilisateur a touchée. 

3
diederikh
func handleFrontTap(gestureRecognizer: UITapGestureRecognizer) {
    print("tap working")
    if gestureRecognizer.state == UIGestureRecognizerState.Recognized { 
        `print(gestureRecognizer.locationInView(gestureRecognizer.view))`
    }
}
0
user3108511