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!
Pomyśl o różnych układach współrzędnych, których używasz tutaj ... – matt
Nie rozumiem – Omer
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