2015-03-06 15 views
5

Próbuję sprawdzić, czy dotknięcie dzieje się w określonym regionie na ekranie. Mam założyć TapGestureRecognizer jest to kod mam teraz:Jak sprawdzić, czy kliknięcie wystąpiło w określonym miejscu?

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

Aplikacja uznane kurka z kranu, ale nie w konkretnym regionie, co jest nie tak z tym kodem?

UPDATE

ja nie wiem, czy to ważne, ale Region jest TextView

+3

Pomyśl o różnych układach współrzędnych, których używasz tutaj ... – matt

+0

Nie rozumiem – Omer

+0

Zanim będziesz mógł wywołać CGRectContainsPoint, potrzebujesz rect i point _in tego samego układu współrzędnych_. Chciałbym przekonwertować 'point' na układ współrzędnych samego self.Region, a teraz porównać' point' do 'self.Region.bounds'. Zobacz moją książkę: http://www.apeth.com/iOSBook/ch14.html#_frame i http://www.apeth.com/iOSBook/ch14.html#_bounds_and_center – matt

Odpowiedz

7

(UWAGA. Zakładam, że self.Region jest UIView Nie wyjaśnić, co to jest w twoim pytaniu, więc muszę zgadnąć, co to może być, przy okazji, proszę nie używać dużej litery na nazwę nieruchomości, robię to tylko po to, abyś mógł łatwo dopasować swój kod.)

Pomyśl o układach współrzędnych. Mówisz

var point = tap.locationInView(self.view) 

Oznacza to, że point jest w self.view „s układu współrzędnych. Ale to niewłaściwy układ współrzędnych, jeśli chcesz zadzwonić do CGRectContainsPoint. Zanim będzie można wypracować relacje między point i self.Region, trzeba dostać point w tym samym układzie współrzędnych jako self.Region:

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

Teraz można użyć self.Region.bounds, który jest w tym samym układzie współrzędnych jako nowej wartości point:

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

Moja pierwsza odpowiedź, nawet ze szkicem, był brudny. Usunąłem go.

Oto kilka sposobów na osiągnięcie tego, czego szukasz. Zakładamy, że twój region jest UIView.

Rozwiązanie 1

Jesteś pobierania punkt z głównym widoku, więc trzeba sprawdzić, czy rama Twojego regionView zawiera punkt. systemu

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

} 

Rozwiązanie 2

Jesteś zdobycie punktu i konwertować go do wewnątrz regionView współrzędne. Musisz więc sprawdzić, czy punkt znajduje się w zakresie granic Twojego regionuView.

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

} 

Rozwiązanie 3

dostać punkt ze swojej regionView bezpośrednio.Więc nie trzeba konwertować to jednak trzeba jeszcze sprawdzić, czy to w ramach swoich granicach jak rozwiązania 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. 
    } 

} 

Alternatywnie, można tylko ustawić swój gest rozpoznawania na regionView: self.regionView.addGestureRecognizer(tap) .

Daj mi znać, jeśli to pomogło!

+0

Region to pole tekstowe, myślę, że właśnie dlatego Twój kod nie działa dla mnie, gdy sprawdziłem go na obrazie, to działa dobrze. – Omer

Powiązane problemy