2015-03-06 20 views
5

Tôi đang cố gắng kiểm tra xem có vòi nước nào đang diễn ra ở một khu vực cụ thể trên màn hình hay không. Tôi đã thiết lập một TapGestureRecognizer đây là mã mà tôi có ngay bây giờ:Cách kiểm tra xem vòi nước có xảy ra ở một địa điểm cụ thể không

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

Ứng dụng đã nhận dạng vòi nhưng không chạm vào vùng cụ thể, Mã có gì sai?

CẬP NHẬT

Tôi không biết nếu nó quan trọng nhưng khu vực là một TextView

+3

Hãy suy nghĩ về các hệ tọa độ khác nhau mà bạn đang sử dụng ở đây ... – matt

+0

Tôi không hiểu – Omer

+0

Trước khi bạn có thể gọi CGRectContainsPoint, bạn cần một điểm trực tiếp và một điểm _ trong cùng một hệ tọa độ_. Những gì tôi sẽ làm là chuyển đổi 'điểm' thành hệ tọa độ của' self.Region', và bây giờ so sánh 'điểm' với' self.Region.bounds'. Xem sách của tôi: http://www.apeth.com/iOSBook/ch14.html#_frame và http://www.apeth.com/iOSBook/ch14.html#_bounds_and_center – matt

Trả lời

7

(LƯU Ý:. Tôi giả định rằng self.Region là một UIView Bạn không giải thích nó là gì trong câu hỏi của bạn, vì vậy tôi phải đoán những gì nó có thể được. Bằng cách này, xin vui lòng không sử dụng một bức thư vốn cho tên của một tài sản. Tôi đang làm điều này chỉ để cung cấp cho bạn một trận đấu dễ dàng để mã của riêng bạn.)

Suy nghĩ về các hệ tọa độ. Bạn đang nói

var point = tap.locationInView(self.view) 

Điều đó có nghĩa rằng point là trong self.view 's hệ tọa độ. Nhưng đó là hệ tọa độ sai nếu bạn định gọi CGRectContainsPoint. Trước khi bạn có thể làm việc ra các mối quan hệ giữa pointself.Region, bạn cần phải nhận được point vào hệ tọa độ tương tự như self.Region:

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

Bây giờ bạn có thể sử dụng self.Region.bounds, mà là trong hệ tọa độ tương tự như các giá trị mới của point:

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

Câu trả lời đầu tiên của tôi, ngay cả với bản phác thảo, đã lộn xộn. Tôi đã xóa nó.

Vì vậy, dưới đây là nhiều cách để đạt được những gì bạn đang tìm kiếm. Chúng tôi sẽ giả định rằng khu vực của bạn là UIView.

Giải pháp 1

Bạn đang lấy điểm từ giao diện chính , vì vậy bạn cần phải kiểm tra xem khung của regionView của bạn có chứa điểm của bạn.

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

} 

Giải pháp 2

Bạn đang lấy điểm và chuyển đổi nó vào bên trong regionView phối hệ thống. Vì vậy, bạn cần kiểm tra xem điểm có nằm trong phạm vi giới hạn trong vùng của bạn không.

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

} 

Giải pháp 3

Bạn nhận được điểm từ bạn regionView trực tiếp.Vì vậy, bạn không cần phải chuyển đổi nó, tuy nhiên bạn vẫn cần phải kiểm tra xem nó trong vòng giới hạn của nó như giải pháp 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. 
    } 

} 

Ngoài ra, bạn chỉ có thể thiết lập nhận dạng cử chỉ của bạn trên regionView: self.regionView.addGestureRecognizer(tap) .

Hãy cho tôi biết nếu điều đó có ích!

+0

Khu vực này là textField, tôi nghĩ đó là lý do mã của bạn không làm việc cho tôi, khi tôi kiểm tra nó trên một hình ảnh nó hoạt động tốt. – Omer

Các vấn đề liên quan