【问题标题】:UIMenuController in a TableViewCell ElementTableViewCell 元素中的 UIMenuController
【发布时间】:2019-03-04 23:07:49
【问题描述】:

当点击单元格中的图像时,我希望获得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!")
    }

}

表格视图:

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。我所做的一切都不允许显示菜单。

【问题讨论】:

  • 在显示菜单之前尝试确保单元格是第一响应者。
  • 是的,我之前尝试将becomeFirstResponder 作为imageTapped 函数中的第一条语句。它没有帮助。
  • @C6Silver 尝试将 override var canBecomeFirstResponder: Bool { return true } 添加到您的 tableview 控制器
  • @LeoDabus - 不幸的是没有快乐。与单元格中的becomeFirstResponder() 一起添加到 TVC,但仍然没有菜单显示。
  • 为了傻笑,我将方法添加到我在表控制器中的 UIBarButton 中。它在那里工作。显然不是我要找的,但至少我知道函数应该是正确的。

标签: swift uitableview uimenucontroller


【解决方案1】:

我通过在单元子类中创建协议解决了这个问题,并将表格视图控制器分配为委托。当点击图像时,它会触发委托,然后在 tableview 中而不是在 tableviewcell 中创建UIMenuController。我将单元格传回,然后我可以使用它的视图来显示菜单。根据 Leo Dabus 的评论,还需要在 tableview 上具有以下内容。

override var canBecomeFirstResponder: Bool {
        return true
   }

最后,虽然我无法在 tableviewcell 子类中完成这项工作,但我确实发现这是一个可以接受的解决方法。

【讨论】:

    猜你喜欢
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多