Касание Жест не работает должным образом при добавлении в пользовательский вид в ячейке коллекции. - PullRequest
0 голосов
/ 11 декабря 2018

Я добавляю распознаватель жестов касания программно в класс ячеек пользовательского представления коллекции.по некоторым причинам, это, кажется, не работает.кадр не равен 0, isUserInteractionEnabled имеет значение true, и я убедился, что представление касания находится поверх всех других представлений:

Пользовательский класс ячейки:

let containerView: UIView = {
    let view = UIView()
    view.isUserInteractionEnabled = true
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

let tapView: UIView = {
    let v = UIView()
    v.isUserInteractionEnabled = true
    return v
}()

let tap: UITapGestureRecognizer = {
    let t = UITapGestureRecognizer(target: self, action: #selector(tapped))
    return t
}()

@objc fileprivate func tapped() {
    print("tap")
}

func setTap() {
    self.containerView.addSubview(tapView)
    tapView.frame = self.frame
    // layout constraint code - printing frame shows its not 0 after this

    tapView.addGestureRecognizer(tap)
}

В контроллере представленияфайл, который имеет представление коллекции:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! SuggestCell
    cell.category.text = data[indexPath.row].category
    cell.word.text = data[indexPath.row].word
    cell.setTap()
    print(cell.tapView.frame)
    return cell
}

Я понимаю, что существует метод didSelectItemAt, но я пробую некоторое пользовательское поведение, которое обнаруживает несколько нажатий на ячейку и выполняет действие

1 Ответ

0 голосов
/ 11 декабря 2018

Проблема в том, что в вашем определении свойства tap, self не является экземпляром пользовательского класса ячейки, потому что на момент создания свойства объект не был полностью инициализирован.

Если вы добавите:

print(type(of: self))

к этому коду, вы увидите, что он печатает:

(CustomCell) -> () -> CustomCell

вместо желаемого:

CustomCell

Такваша цель / действие использует неправильную цель.

Простой способ исправить это - tap a lazy var:

lazy var tap: UITapGestureRecognizer = {
    let t = UITapGestureRecognizer(target: self, action: #selector(tapped))
    return t
}()

Затем при первом обращении к tap, будет создан распознаватель жестов касания, и в это время будет создана ваша пользовательская ячейка, и self будет ссылаться на экземпляр класса.


В качестве альтернативы, вы можете сделать tap a вычисляемое свойство :

var tap: UITapGestureRecognizer {
    let t = UITapGestureRecognizer(target: self, action: #selector(tapped))
    return t
}

и tap создадут и вернут UITapGestureRecognizer при обращении к нему.Опять же, в этом случае пользовательская ячейка будет создана, поэтому self будет правильно ссылаться на экземпляр класса.

...