Как добавить жест для представления внутри ячейки представления коллекции? - PullRequest
0 голосов
/ 14 января 2019

Я добавляю представление с набором изображений (socialView) в ячейку представления коллекции (также с другими представлениями), для которых необходимо выполнить общий щелчок. Этот клик не должен совпадать с кликом в ячейке представления коллекции.

Я думаю о добавлении UITapGestureRecognizer для socialView каждый раз в методе делегирования collectionView cellForItemAt. Но я хочу знать, это правильный путь? Более того, я хочу получить indexPath / позицию, по которой вызывается socialView.

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.socialViewTapped))

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "bidderAuctionCell", for: indexPath) as! BidderAuctionViewCell
     cell.socialView.addGestureRecognizer(tapGestureRecognizer)
}

@objc func socialViewTapped() {
     // Which item cell's socialview is clicked
}

UPDATE

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

class CustomViewCell: UICollectionViewCell {

    var index : IndexPath!
    var socialViewDelegate : SocialViewDelegate!

    @IBOutlet weak var socialView: UIView!

    override init(frame: CGRect) {
        super.init(frame:frame)
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action:   #selector(self.viewTapped))
        socialView.addGestureRecognizer(tapGestureRecognizer)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
    }

    @objc func viewTapped(){
        socialViewDelegate.socialViewTapped(at: index)
    }
}

Функция init не вызывается. Я также пытался вставить требуемый init, но там социальное представление не инициализировано. Так разбился

ФИНАЛЬНЫЙ ОТВЕТ

класс CustomViewCell: UICollectionViewCell {

    var index : IndexPath!
    var socialViewDelegate : SocialViewDelegate!

    @IBOutlet weak var socialView: UIView!

    override func awakeFromNib() {
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        socialView.isUserInteractionEnabled = true
        socialView.addGestureRecognizer(tapGesture)
    }

    @objc func handleTap(){
        socialViewDelegate.socialViewTapped(at: index)
    }
}
protocol SocialViewDelegate {
    func socialViewTapped(at index: IndexPath)
}

Ответы [ 2 ]

0 голосов
/ 14 января 2019

@ Anurag. Вы можете решить эту проблему, используя одно из следующих понятий: делегирование, замыкания, уведомления. Я предлагаю вам пойти с шаблоном делегирования, который iOS широко использует в своих компонентах, таких как UITableView, UICollectionView и т. Д.

  • Перед реализацией шаблона делегирования добавьте в представление распознаватель жестов касания.
  • В CollectionViewCell объявите метод протокола для делегирования вашего нажатия / действия
  • Подтвердите реализацию делегата в вашем контроллере представления.
  • Реализуйте ваш делегированный метод в вашем контроллере представления.

Пример кодирования:

1. Ваш CollectionViewCell должен выглядеть следующим образом :

   import UIKit

    Protocol ViewTappedDelegate: class {
     func viewTapped(_ photo : String) { }
   }

    class YourCell: UICollectionViewCell, UIGestureRecognizerDelegate {

        @IBOutlet weak var containerView: UIView!
        weak var delegate : ViewTappedDelegate?

        override func awakeFromNib() {
            let tapGesture = UITapGestureRecognizer(target: self,
                                                    action: #selector(handleTap(recognizer:)))
            tapGesture.delegate = self
            containerView.isUserInteractionEnabled = true
            containerView.addGestureRecognizer(tapGesture)
        }

        @objc func handleTap(recognizer:UITapGestureRecognizer) {
            //Call Delegate method from here...
        }

    }

2. В ViewController

        func collectionView(_ collectionView: UICollectionView,
                    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


               let cell =  collectionView.dequeueReusableCell(withReuseIdentifier: "cellIdentifier",
                                                  for: indexPath) as! YourCell

              cell.delegate = self
              return cell
          }



    // MARK: Delegate
     extension YourViewController : ViewTappedDelegate {
        func viewTapped(_ photo : String) {
          // Handle delegation here...
        }
    }
0 голосов
/ 14 января 2019

Чтобы добавить жест касания, добавьте следующий код в ячейку представления вашей коллекции.

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.socialViewTapped))
socialView?.addGestureRecognizer(tapGestureRecognizer)
socialView?.isUserInteractionEnabled = true

Добавьте этот код в ячейку представления коллекции.

...