2012-05-11 12 views
26

Ich arbeite an einer Grafikrechner-App für das iPad, und ich wollte eine Funktion hinzufügen, mit der ein Benutzer auf einen Bereich in der Diagrammansicht tippen kann, um ein Textfeld mit der Koordinate des von ihnen berührten Punkts anzuzeigen. Wie kann ich einen CGPoint daraus erhalten?Wie bekomme ich einen CGPoint von einem geklopften Ort?

Antwort

46

Sie haben zwei Art und Weise ...

1.

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

hier können Sie Lage mit Punkt aus jetziger Sicht bekommen ...

2.

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

Hier wird dieser Code verwendet, wenn Sie etwas mit Ihrem Objekt oder einer Unteransicht Ihrer Hauptansicht tun möchten

19

Diese

- (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); 

} 

Sie verwenden können „touchesEnded“ Versuchen Sie, wenn Sie lieber sehen würde, wo der Benutzer aus dem Bildschirm mit dem Finger gehoben statt, wo sie aufsetzten.

3

Falls Sie ein UIGestureRecognizer oder UITouch-Objekt verwenden, können Sie die locationInView: Methode verwenden, um die CGPoint innerhalb der gegebenen Ansicht der Benutzer berührt abzurufen.

6

Es ist wahrscheinlich besser und einfacher, einen UIGestureRecognizer mit der Kartenansicht zu verwenden, anstatt zu versuchen, eine Unterklasse zu erstellen und Berührungen manuell abzufangen.

Schritt 1: Fügen Sie zunächst die Gestenerkenner in die Kartenansicht:

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

Schritt 2: Als nächstes implementieren shouldRecognizeSimultaneouslyWithGestureRecognizer und zurück JA so Ihr Leitungs Gestenerkenner zur gleichen Zeit wie die Karte arbeiten können (sonst tippt auf den Stift wird nicht automatisch von der Karte behandelt werden):

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

Schritt 3: Schließlich die Geste Handler implementieren:

- (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); 
} 
+1

Dies ist eine schöne vollständige Antwort –

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

Ich will nur in einer Swift 4 Antwort werfen, weil die API ganz anders aussehende ist.

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 
    } 
} 

ODER

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 
} 

In beiden Fällen loc den Punkt enthalten, die in der Ansicht berührt wurde.

Verwandte Themen