Подтвердить что ты не робот

GestureRecognizer не реагирует на нажатие

После инициализации подклассом UIImageView меня есть следующая строка кода:

self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))

Я создал необходимую связанную функцию:

func handleTap(gestureRecognizer: UITapGestureRecognizer) {
    print("In handler")
}

При нажатии на вид, о котором идет речь, "In handler никогда не выводился на консоль". Затем я удалил функцию-обработчик, чтобы посмотреть, будет ли компилятор жаловаться на отсутствующую функцию. Это не так.

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

Обновление: мой класс на самом деле UIImageView в отличие от UIView

4b9b3361

Ответ 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 которого у меня был в этом обычном классе, и поместил в него логику жестов.