Как я могу гарантировать, что UITapGesture также срабатывает при нажатии UIButton? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть UIViewController, который имеет 4 UICollectionViews. Каждый CollectionView использует одну и ту же настраиваемую ячейку через NIB. В каждой ячейке есть кнопки, действия которых определяются с использованием структуры делегата.

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

Я хотел бы знать, есть ли способ получить экранные координаты кнопки относительно основного view.

Я попытался переопределить touchBegan, но это также не удалось.

Можно ли каким-либо образом запустить несколько действий с помощью кнопки делегата? Т.е. была ли эта функция запущена во время записи местоположения касания на экране?

1 Ответ

0 голосов
/ 30 апреля 2020

Вам не нужен UITapGesture:

При cellForItemAt сохраните уникальный идентификатор в виде строки внутри переменной. Вы также можете установить IndexPath (но у вас есть несколько CollectionViews) или вы можете установить уникальный тег для UIButton.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: MyCell.identifier, for: indexPath) as! MyCell
    cell.buttonIdentifier = "Cell-XY"
}

// Delegate
func didTapOnMyButton(with identifier: String) {
    switch identifier {
    case "Cell-XY": // is button "Cell-XY"
    default: // can'z happend, but handle that too
    }
}



class MyCell: UICollectionViewCell {
    static let identifier = "MyCell"

    var buttonIdentifier = ""

    @objc didTapOnMyButton() {
        delegate?.didTapOnMyButton(with: buttonIdentifier)
    }


    override func prepareForReuse() {
        super.prepareForReuse()
        buttonIdentifier = ""
    }
}
...