UIMenuController в элементе TableViewCell - PullRequest
0 голосов
/ 29 сентября 2018

Я хочу получить UIMenuController, когда изображение в ячейке коснулось.Чтобы быть понятным, это не когда постукивают по ячейке, а когда это касается изображения внутри ячейки.Жест касания к изображению срабатывает должным образом и запускает функцию, но меню никогда не отображается.

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

class VideoHomeCell: UITableViewCell {

    var thumbImage:UIImage! {
        didSet {
            createCell()
        }
    }

    private lazy var thumbImageView:UIImageView = {
        let view = UIImageView(image: self.thumbImage)
        view.contentMode = .scaleAspectFill
        view.clipsToBounds = true
        view.isUserInteractionEnabled = true
        view.translatesAutoresizingMaskIntoConstraints = false
        let gesture = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
        view.addGestureRecognizer(gesture)
        return view
    }()

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    func createCell() {
        self.addSubview(thumbImageView)
        thumbImageView.heightAnchor.constraint(equalToConstant: 100).isActive = true
        thumbImageView.widthAnchor.constraint(equalToConstant: 100).isActive = true
        thumbImageView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
        thumbImageView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    }

    @objc func imageTapped(recognizer: UIGestureRecognizer) {
        let menuController = UIMenuController.shared
        let trimItem = UIMenuItem(title: "Trim", action: #selector(menuSelected))
        menuController.menuItems = [trimItem]
        menuController.setTargetRect(self.thumbImageView.frame, in: self.superview!)
        menuController.setMenuVisible(true, animated: true)
    }

    @objc func menuSelected() {
        print("Menu Selection!")
    }

}

TableView:

override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.videoModelArray.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! VideoHomeCell

        cell.thumbImage = self.videoModelArray[indexPath.row].originalThumbnail

        return cell
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100.0
    }

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

1 Ответ

0 голосов
/ 29 сентября 2018

Я решил эту проблему, создав протокол в подклассе ячейки, и назначил контроллер табличного представления в качестве делегата.При касании изображения оно запускает делегата, а затем UIMenuController создается в представлении таблицы, а не в ячейке просмотра таблицы.Я передаю обратно клетку и могу использовать ее вид для отображения меню.Также необходимо иметь следующее в табличном представлении для комментария Лео Дабуса.

override var canBecomeFirstResponder: Bool {
        return true
   }

В конце концов, хотя я не смог сделать эту работу внутри подкласса tableviewcell, я считаю это приемлемым обходным решением.

...