2015-03-06 21 views
5

Sto provando a controllare se un rubinetto sta accadendo in una regione specifica sullo schermo. Ho installato un TapGestureRecognizer questo è il codice che ho adesso:Come verificare se il rubinetto si è verificato in un luogo specifico

func handleTap(tap: UITapGestureRecognizer) { 
    var point = tap.locationInView(self.view) 
    println("tapped") 

    if (tap.state == UIGestureRecognizerState.Ended) 
    { 
     if (CGRectContainsPoint(self.Region.frame, point)) { 
      println("touch") 
      var y = kbHeight - textYoutube.center.y 
      youTextConst.constant += y 
     } 
    } 
} 

L'applicazione ha riconosciuto il rubinetto, ma non il rubinetto nella regione specifica, cosa c'è di sbagliato con il codice?

UPDATE

Non so se è importante ma la regione è un TextView

+3

Pensa ai diversi sistemi di coordinate che stai utilizzando qui ... – matt

+0

Non capisco – Omer

+0

Prima di chiamare CGRectContainsPoint hai bisogno di un rect e un punto _in lo stesso sistema di coordinate_. Quello che vorrei fare è convertire 'point' nel sistema di coordinate di' self.Region' stesso, e ora confrontare 'point' con' self.Region.bounds'. Vedi il mio libro: http://www.apeth.com/iOSBook/ch14.html#_frame e http://www.apeth.com/iOSBook/ch14.html#_bounds_and_center – matt

risposta

7

(NOTA:. Io parto dal presupposto che self.Region è un UIView Non si spieghi di cosa si tratta nella tua domanda, quindi devo indovinare cosa potrebbe essere.A proposito, per favore non usare una lettera maiuscola per il nome di una proprietà.Io lo sto facendo solo per darti una corrispondenza facile con il tuo codice.)

Pensa ai sistemi di coordinate. Lei sta dicendo

var point = tap.locationInView(self.view) 

Ciò significa che point è in self.view 's sistema di coordinate. Ma questo è il sistema di coordinate sbagliato se hai intenzione di chiamare CGRectContainsPoint. Prima di poter elaborare il rapporto tra point e self.Region, è necessario per ottenere point nello stesso sistema di coordinate come self.Region:

point = self.Region.convertPoint(point, fromView:self.view) 

Ora è possibile utilizzare self.Region.bounds, che è nello stesso sistema di coordinate come nuovo valore di point:

if CGRectContainsPoint(self.Region.bounds, point) 
1

la mia prima risposta, anche con il disegno, era disordinato. L'ho cancellato.

Quindi, ecco diversi modi per ottenere ciò che stai cercando. Supponiamo che la tua regione sia un UIView.

Soluzione 1

si recupera il punto dal vista principale, quindi è necessario verificare se il cornice della vostra regionView contiene il punto.

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet var regionView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let tap = UITapGestureRecognizer() 
     tap.addTarget(self, action: "handleTap:") 

     self.view.addGestureRecognizer(tap) 
    } 

    func handleTap(tap: UITapGestureRecognizer) { 
     if (tap.state == UIGestureRecognizerState.Ended) { 
      println("[handleTap] Tap ended") 

      var point = tap.locationInView(self.view) 

      println("[handleTap] Tap point : x\(point.x) ; y\(point.y) (in self.view)") 

      if (CGRectContainsPoint(self.regionView.frame, point)) { 
       println("[handleTap] Tap is inside regionView") 
      } 

      println() 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

Soluzione 2

si recupera il punto e convertire esso all'interno regionView sistema di coordinate. Quindi è necessario verificare se il punto è all'interno dei limiti di regionView.

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet var regionView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let tap = UITapGestureRecognizer() 
     tap.addTarget(self, action: "handleTap:") 

     self.view.addGestureRecognizer(tap) 
    } 

    func handleTap(tap: UITapGestureRecognizer) { 
     if (tap.state == UIGestureRecognizerState.Ended) { 
      println("[handleTap] Tap ended") 

      var point = tap.locationInView(self.view) 

      println("[handleTap] Tap point : x\(point.x) ; y\(point.y) (in self.view)") 

      point = self.regionView.convertPoint(point, fromView: self.view) 

      println("[handleTap] Tap point converted : x\(point.x) ; y\(point.y) (in self.regionView)") 

      if (CGRectContainsPoint(self.regionView.bounds, point)) { 
       println("[handleTap] Tap is inside regionView") 
      } 

      println() 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

Soluzione 3

si ottiene il punto dal regionView direttamente.Quindi non c'è bisogno di convertire esso, tuttavia è comunque necessario verificare se è entro i suoi confini come soluzione 2.

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet var regionView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let tap = UITapGestureRecognizer() 
     tap.addTarget(self, action: "handleTap:") 

     self.view.addGestureRecognizer(tap) 
    } 

    func handleTap(tap: UITapGestureRecognizer) { 
     if (tap.state == UIGestureRecognizerState.Ended) { 
      println("[handleTap] Tap ended") 

      var point = tap.locationInView(self.regionView) 

      println("[handleTap] Tap point : x\(point.x) ; y\(point.y) (in self.view)") 

      if (CGRectContainsPoint(self.regionView.bounds, point)) { 
       println("[handleTap] Tap is inside regionView") 
      } 

      println() 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

In alternativa, è possibile impostare solo il vostro riconoscitore gesto sul regionView: self.regionView.addGestureRecognizer(tap) .

Fammi sapere se ha aiutato!

+0

La regione è un campo di testo, penso sia per questo che il tuo codice non funziona per me, quando l'ho verificato su un'immagine funziona perfettamente. – Omer