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!
Hãy suy nghĩ về các hệ tọa độ khác nhau mà bạn đang sử dụng ở đây ... – matt
Tôi không hiểu – Omer
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