Как проверить, произошло ли нажатие в определенном месте

Я пытаюсь проверить, происходит ли касание в определенном регионе на экране. Я установил 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
        }
        
    }
}
Другие вопросы по тегам