UITapGestureRecognizer не работает с пользовательским классом представления - PullRequest
0 голосов
/ 30 марта 2020

UITapGestureRecognizer отлично работает в код 1 . tapAction называется как ожидалось. Однако это не работает в код 2 . Может кто-нибудь, пожалуйста, скажите мне, что не так в коде 2 ?

( Это и это довольно похожие вопросы, но все еще не могу понять все) ?

Код 1:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let myView : UIView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        myView.backgroundColor = .red
        myView.addGestureRecognizer( UITapGestureRecognizer(target:self,action:#selector(self.tapAction)) )

        self.view.addSubview(myView)
    }

    @objc func tapAction() {
        print("tapped")
    }
}

Код 2:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let myView = MyView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        self.view.addSubview(myView)
    }
}

class MyView : UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        initView()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func initView(){
        let myView : UIView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        myView.backgroundColor = .red
        myView.addGestureRecognizer(UITapGestureRecognizer(target:self,action:#selector(self.doSomethingOnTap)))
        addSubview(myView)
    }

    @objc func doSomethingOnTap() {
        print("tapped")
    }
}

1 Ответ

1 голос
/ 30 марта 2020

Вы создаете подпредставление, которое в данном конкретном случае выходит за пределы родительских границ, поскольку основной вид представления имеет высоту 100 и ширину 100, а подпредставление размещается в x: 100 и y: 100, в результате чего оно располагается в точный конец родительского элемента.

Подпредставление, которое вы создаете в initView, должно иметь (x: 0, y: 0) origin.

...