TableViewCell元素中的UIMenuController

时间:2018-09-29 00:21:45

标签: swift uitableview uimenucontroller

我希望在点击单元格中的图像时得到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 :(得分:0)

我通过在单元子类中创建协议来解决此问题,并将表视图控制器分配为委托。轻按图像后,它将激发委托,然后在表视图内而不是在表视图单元格内创建UIMenuController。我传回单元格,然后可以使用它的视图显示菜单。根据Leo Dabus的评论,还必须在表格视图中具有以下内容。

override var canBecomeFirstResponder: Bool {
        return true
   }

最后,虽然我无法在tableviewcell子类中进行此工作,但确实找到了可以接受的解决方法。