2015-03-06 29 views
5

Ekranda belirli bir bölgede bir dokunun olup olmadığını kontrol etmeye çalışıyorum.Belirli bir yerde musluğun olup olmadığı nasıl kontrol edilir

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

uygulama musluğunu ancak belirli bir bölgedeki musluk tanıdı kod nesi var: Bir TapGestureRecognizer kurdum bu şu anda var kodudur?

GÜNCELLEME

bu konularda ama Bölge

+3

Burada kullandığınız farklı koordinat sistemlerini düşünün ... – matt

+0

Anlamadım – Omer

+0

CGRectContainsPoint'i aramadan önce, bir rekt ve _in aynı koordinat sistemi_in. Yapmam gereken şey 'point'ı self.Region'un kendi koordinat sistemine dönüştürmek ve şimdi' point' i selfini self.Region.bounds' ile karşılaştırmak. Kitabıma bakın: http://www.apeth.com/iOSBook/ch14.html#_frame ve http://www.apeth.com/iOSBook/ch14.html#_bounds_and_center – matt

cevap

7

(NOT bir TextView'un ise bilmiyorum. Ben self.Region UIView olduğunu varsayıyorum Ne olduğunu açıklamak yok Sorunuzda, ne olabileceğini tahmin etmeliyim. Bu arada, lütfen bir mülkün adı için büyük harf kullanmayın. Bunu sadece kendi kodunuzla kolay bir eşleşme sağlamak için yapıyorum.)

Koordinat sistemleri hakkında düşünün. Sen point koordinat sisteminde self.view olduğu anlamına gelir Yani

var point = tap.locationInView(self.view) 

söylüyor. Ancak CGRectContainsPoint'i arayacaksanız, yanlış koordinat sistemi budur. Eğer point ve self.Region arasındaki ilişkiyi çalışmak için, önce self.Region aynı koordinat sistemine point almak gerekir:

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

Şimdi yeni değeri olarak aynı koordinat sisteminde olduğu self.Region.bounds kullanabilirsiniz point:

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

Benim ilk cevap, hatta kroki ile, dağınık oldu. Onu sildim.

İşte aradığınız şeyi elde etmenin birden çok yolu var. Bölgenizin UIView olduğunu varsayalım.

Eğer regionView ait çerçeve açınızı içeriyorsa kontrol etmeniz gerekir, böylece Ana görünümde gelen noktayı alınıyor 1

Çözüm.

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

} 

Noktayı alınıyor ve regionView için o dönüştürmek 2

Çözüm sistemini koordine eder. Bu yüzden, noktanızın bölgenizin sınırları sınırları içinde olup olmadığını kontrol etmeniz gerekir. 3

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

} 

Çözüm Doğruca regionView dan noktası olsun.Yani sadece regionView üzerinde jest tanıyıcı ayarlayabilirsiniz, ancak yine de 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. 
    } 

} 

Alternatif çözüm gibi kendi sınırları içinde olup olmadığını kontrol etmek gerekir, dönüştürmek gerekmez : self.regionView.addGestureRecognizer(tap) .

Yardım ederse bana bildirin!

+0

Bölge bir textField, bence bu yüzden kodunuz benim için işe yaramıyor, bir görüntü üzerinde kontrol ettiğimde iyi çalışıyor. – Omer

İlgili konular