Как проверить, произошло ли нажатие в определенном месте
Я пытаюсь проверить, происходит ли касание в определенном регионе на экране. Я установил TapGestureRecognizer, это код, который я сейчас имею:
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
}
}
}
Приложение распознало касание, но не касание в определенном регионе. Что не так с кодом?
ОБНОВИТЬ
Я не знаю, имеет ли это значение, но Region является TextView
3 ответа
(ПРИМЕЧАНИЕ: я предполагаю, что self.Region
это UIView. Вы не объясняете, что это в вашем вопросе, поэтому я должен догадаться, что это может быть. Кстати, пожалуйста, не используйте заглавную букву для названия объекта. Я делаю это только для того, чтобы вы могли легко сопоставить ваш собственный код.)
Подумайте о системах координат. Ты говоришь
var point = tap.locationInView(self.view)
Это означает, что point
в self.view
Система координат. Но это неправильная система координат, если вы собираетесь вызывать CGRectContainsPoint. Прежде чем вы сможете выяснить отношения между point
а также self.Region
нужно получить point
в ту же систему координат, что и self.Region
:
point = self.Region.convertPoint(point, fromView:self.view)
Теперь вы можете использовать self.Region.bounds
, которая находится в той же системе координат, что и новое значение point
:
if CGRectContainsPoint(self.Region.bounds, point)
Мой первый ответ, даже с эскизом, был грязным. Я удалил это.
Итак, вот несколько способов достичь того, что вы ищете. Предположим, что ваш регион является UIView.
Решение 1
Вы извлекаете точку из основного вида, поэтому вам нужно проверить, содержит ли кадр вашего regionView вашу точку.
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.
}
}
Решение 2
Вы извлекаете точку и конвертируете ее во внутреннюю систему координат regionView. Поэтому вам нужно проверить, находится ли точка в пределах вашего regionView.
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.
}
}
Решение 3
Вы получаете точку из своего регионаПросмотр напрямую. Таким образом, вам не нужно конвертировать его, однако вам все равно нужно проверить, находится ли он в его границах, как решение 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.
}
}
Кроме того, вы можете установить распознаватель жестов только для regionView: self.regionView.addGestureRecognizer(tap)
,
Дайте мне знать, если это помогло!
Swift 5:
func handleTap(recognizer: UITapGestureRecognizer) {
if (recognizer.state == .ended) {
let point = recognizer.location(in: self.view)
if (self.headerView.frame.contains(point)) {
// Do something
}
}
}