GestureRecognizer не реагирует на нажатие
После инициализации подклассом UIImageView
меня есть следующая строка кода:
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
Я создал необходимую связанную функцию:
func handleTap(gestureRecognizer: UITapGestureRecognizer) {
print("In handler")
}
При нажатии на вид, о котором идет речь, "In handler никогда не выводился на консоль". Затем я удалил функцию-обработчик, чтобы посмотреть, будет ли компилятор жаловаться на отсутствующую функцию. Это не так.
Я положительно озадачен. Я был бы очень признателен любому легкому человеку, который мог бы пролить это.
Обновление: мой класс на самом деле UIImageView
в отличие от UIView
Ответы
Ответ 1
Я обнаружил ответ после тщательного изучения кода.
Одно из родительских представлений было создано без предоставления frame:
В то время как это ошибка noobish, чтобы гарантировать удаление этих вопросов, вероятность того, что у кого-то еще будет такая же проблема в будущем...
Ответ 2
Я использовал UITapGestureRecognizer
который я поместил на UILabel
с помощью раскадровки.
Чтобы заставить это работать, мне также пришлось поставить галочку в блоке с надписью: "Взаимодействие с пользователем включено" в UILabel
атрибутов UILabel
в раскадровке.
![enter image description here]()
Ответ 3
Попробуй это
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.view.userInteractionEnabled = true
var tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
self.view.addGestureRecognizer(tapGesture)
}
func handleTap(sender : UIView) {
println("Tap Gesture recognized")
}
Ответ 4
Скорее всего, вы добавите UIGestureRecognizer
в неправильное место. Вот рабочий пример с UIView
от storyboard
. Если вы создаете свой UIView
динамически, вы должны поместить эту инициализацию в правильный конструктор.
class TestView: UIView
{
override func awakeFromNib()
{
self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}
func handleTap(gestureRecognizer: UITapGestureRecognizer)
{
println("Here")
}
}
Ответ 5
В дополнение к другим ответам это может быть вызвано добавлением распознавателя жестов к нескольким представлениям. Распознаватели жестов предназначены только для одиночных просмотров.
Ссылка: fooobar.com/questions/34946/...
Ответ 6
Я столкнулся с этой проблемой с программными представлениями.
Мой UIView с распознавателем жестов имел .isUserInteractionEnabled = true, но он не реагировал на нажатия, пока я не установил .isUserInteractionEnabled = true также для его родительских представлений.
Ответ 7
Этот код работает для меня с XCode 7.0.1
import UIKit
class ImageView: UIImageView {
init(frame: CGRect, sender: Bool, myImage: UIImage) {
super.init(frame: frame)
self.image = myImage
initBorderStyle(sender)
// enable user interaction on image.
self.userInteractionEnabled = true
let gesture = UITapGestureRecognizer(target: self, action: "previewImage:")
addGestureRecognizer(gesture)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func previewImage(myGesture: UITapGestureRecognizer? = nil) {
print("i'm clicked")
}
private func initBorderStyle(sender: Bool) {
self.layer.masksToBounds = true
self.layer.cornerRadius = 8
self.layer.borderWidth = 0.5
self.layer.borderColor = getBorderColor(sender)
self.backgroundColor = getColor(sender)
}
func getBorderColor(sender: Bool) -> CGColor {
var result: CGColor
if sender {
result = UIColor(red: 0.374, green: 0.78125, blue: 0.0234375, alpha: 0.5).CGColor
} else {
result = UIColor(red: 0.3125, green: 0.6015625, blue: 0.828125, alpha: 0.5).CGColor
}
return result
}
}
Ответ 8
Я нашел решение этой проблемы после множества проб и ошибок. Таким образом, есть два решения это два
1. Либо добавьте GestureRecognizer
в viewDidLoad() и поверните userInteractionEnabled
= true
2. При использовании вычисляемого свойства используйте lazy var
вместо let
для свойства.
lazy var profileImageView: UIImageView = {
let iv = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
iv.image = #imageLiteral(resourceName: "gameofthrones_splash")
iv.contentMode = .scaleAspectFill
iv.translatesAutoresizingMaskIntoConstraints = false
iv.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
iv.isUserInteractionEnabled = true
return iv
}()
Ответ 9
Оказалось, что мой жест не работает, потому что он был в обычном классе, а не подклассе UIView
или чего-то еще.
Я решил эту проблему, создав подкласс UIView
, UIView
которого у меня был в этом обычном классе, и поместил в него логику жестов.