2012-08-07 12 views
9

Utilizzo XCode 4.4 in sviluppo per iOS 5 su un iPad e sto utilizzando il layout Storyboard quando creo il mio pulsante personalizzato.Come ottengo le coordinate di tocco su un UIButton personalizzato?

Ho l'evento di tocco correttamente funzionante e la registrazione, ma ora voglio ottenere le coordinate x/y del rubinetto sul mio pulsante personalizzato.

Se possibile, mi piacerebbe che le coordinate fossero relative al pulsante personalizzato anziché relative all'intero schermo dell'iPad.

Ecco il mio codice nel file .h:

- (IBAction)getButtonClick:(id)sender; 

e il mio codice nel file .m:

- (IBAction)getButtonClick:(id)sender { 

     NSLog(@"Image Clicked."); 
    } 

come ho detto, che registra correttamente quando si tocca l'immagine.

Come posso ottenere le coordinate del rubinetto?

Ho provato alcuni esempi diversi da Internet ma si bloccano sempre quando visualizza una serie di numeri (forse le coordinate) nella casella di registro. Sono MOLTO nuovo per lo sviluppo di iOS quindi per favore rendilo il più semplice possibile. Grazie!

+1

Perché avete bisogno di coordinate? –

+0

Artern sta facendo la domanda giusta. Hai davvero bisogno di sapere le coordinate all'interno di un pulsante, o vuoi solo sapere quale pulsante è stato cliccato (nel qual caso, non hai bisogno dell'eccellente suggerimento di Vladimir su "Mittente ed Evento"), ma puoi semplicemente guardare al 'sender' per determinare quale pulsante è stato cliccato. – Rob

+2

Ho bisogno delle coordinate perché sto visualizzando un'immagine come un UIButton e ho bisogno di sapere dove su quell'immagine l'utente ha toccato. So già come dire quale pulsante è stato cliccato. – twbbas

risposta

28

Per ottenere la posizione tocco è possibile utilizzare un'altra variante del metodo di azione pulsante: myAction:forEvent: (se lo si crea da IB nota interfaccia opzione "mittente e l'evento" nel campo argomenti: enter image description here)

Poi, nel tuo gestore di azione si può ottenere la posizione touch da parametro dell'evento, ad esempio:

- (IBAction)myAction:(UIButton *)sender forEvent:(UIEvent *)event { 
    NSSet *touches = [event touchesForView:sender]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:sender]; 
    NSLog(@"%@", NSStringFromCGPoint(touchPoint)); 
} 
+1

Grazie per la tua risposta dettagliata. Tuttavia, sto ancora ricevendo lo stesso errore che ricevo quando provavo altro codice da online. "selettore non riconosciuto inviato all'istanza 0xde26e40 2012-08-07 10: 29: 36.126 Differenze [41044: 707] *** Termine dell'app a causa dell'eccezione non rilevata 'NSInvalidArgumentException', motivo: '- [DifferencesViewController getButtonClick:]: selettore non riconosciuto inviato ad esempio 0xde26e40 '"Hai qualche idea? – twbbas

+1

@ user1262552, hai ancora getButtonClick: metodo collegato all'azione del pulsante, controlla il tuo file storyboard o codice per assicurarti che l'azione dei pulsanti sia legata al metodo esistente del controller di visualizzazione – Vladimir

+0

E l'app sembra bloccarsi quando tocco l'immagine. – twbbas

0

per le tue coordinate complessive (con riferimento allo schermo), è necessario creare un CGPoint che contiene le coordinate del tuo tocco. Ma per farlo, devi prima ottenere quel tocco. Quindi inizia prendendo l'evento di tocco, quindi facendo quel punto usando il metodo locationInView. Ora, a seconda di quando si desidera registrare il contatto - quando l'utente tocca verso il basso o quando alzano il dito -, è necessario implementare questo codice nel metodo touchesBegan o touchesEnded. Diciamo che lo fai touchesEnded, che passa un NSSet cales "tocca" che contiene tutti gli eventi touch.

UITouch *tap = [touches anyObject]; 
CGPoint touchPoint = [tap locationInView:self.view]; 

"touchPoint" ora conterrà il punto in cui l'utente alza il dito. Per stampare le coordinate, è sufficiente accedere alle proprietà X e Y su quel punto:

CGFloat pointX = touchPoint.x; 
CGFloat pointY = touchPoint.y; 
NSLog(@" Coordinates are: %f, %f ", pointX, pointY); 

che deve uscire con le coordinate del tocco. Ora per fare riferimento a qualsiasi pulsante che stai usando, ti suggerirei di sottrarre manualmente i valori per le coordinate del pulsante dal punto. Sembra una soluzione semplice e onestamente non conosco un modo per ottenere coordinate con riferimento a un altro oggetto, a meno che non si crei una vista basata su quell'oggetto e lo si passi a locationInView anziché a self.view.

Per ulteriori informazioni sui tocchi, è disponibile un ottimo set di esercitazioni here.

1

In caso di Swift 3.0 la risposta accettata funziona lo stesso, tranne la sintassi sarà cambiato come segue:

Swift 3.0:

@IBAction func buyTap(_ sender: Any, forEvent event: UIEvent) { 
    let myButton = sender as! UIButton 
    let touches = event.touches(for: myButton) 
    let touch = touches?.first 
    let touchPoint = touch?.location(in: myButton) 
    print("touchPoint\(touchPoint)") 
    } 
Problemi correlati