UIControl не отвечает должным образом - PullRequest
0 голосов
/ 09 мая 2020

Я создал пользовательский UIControl с изображением и заголовком, выровненным по вертикали и горизонтали, один поверх другого, который должен действовать как UIButton.

Проблема в том, что когда Я вызываю addTarget(), чтобы добавить действие, когда элемент касается внутри, действие не работает должным образом, только после того, как несколько касаний выполнят задание.

Что может вызвать эту проблему?

Спасибо.

Вот класс для этого элемента UIControl.

class CustomImageTitleButton: UIControl {

    private var image : UIImageView = UIImageView()

    private var title : UILabel = UILabel()

    required init?(coder: NSCoder) {
        super.init(coder: coder)

        setup()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        setup()
    }

    private func setup() {
        self.backgroundColor = PrimaryLightColor
        self.layer.cornerRadius = 20

        self.translatesAutoresizingMaskIntoConstraints = false
        image.translatesAutoresizingMaskIntoConstraints = false
        title.translatesAutoresizingMaskIntoConstraints = false

        self.addSubview(image)
        self.addSubview(title)

        image.contentMode = .scaleAspectFit

        title.textAlignment = .center
        title.font = title.font.withSize(24)

        setupConstraints()
    }

    private func setupConstraints() {
        NSLayoutConstraint.activate([
            image.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 20),
            image.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -20),
            image.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5, constant: 0),
            image.bottomAnchor.constraint(equalTo: self.centerYAnchor, constant: 8),

            title.topAnchor.constraint(equalTo: self.centerYAnchor),
            title.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 4),
            title.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -4),
            title.bottomAnchor.constraint(equalTo: self.bottomAnchor)
        ])
    }

    func setImage(image : UIImage?) {
        self.image.image = image
    }

    func setTitle(title : String?) {
        self.title.text = title
    }
}

А вот реализация действия:

singlePlayerButton.addTarget(self, action: #selector(initSinglePlayerGame), for: .touchUpInside) // singlePlayerButton is the custom UIControl

@objc func initSinglePlayerGame() {
        print("single player tapped")
        let gameRoom : GameViewController =  GameViewController()
        gameRoom.modalPresentationStyle = .fullScreen
        self.present(gameRoom, animated: true, completion: nil)
    }

EDIT:

Похоже, что UIControl управляет взаимодействием с пользователем, но это не просто касание, это больше похоже на действие «касание, перетаскивание и отпускание».

1 Ответ

0 голосов
/ 09 мая 2020

вы можете использовать HitTest для определения обработки событий UI Control.

Кроме того, вы можете проверить иерархию UI-представлений, если UIControl находится на вершине иерархии представлений.

Отладка -> Просмотр отладки -> Захват иерархии просмотра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...