Я создал пользовательский 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 управляет взаимодействием с пользователем, но это не просто касание, это больше похоже на действие «касание, перетаскивание и отпускание».