iOS長押し弾枠、メニューバー


UIView,UIButton,UIImageViewなどを書き換え,各種コントロールを長押しするポップアップメニューバーを実現する
class MenuView: UIView {
    override var canBecomeFirstResponder: Bool {
        return true
    }
    
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        
        return super.canPerformAction(action, withSender: sender)
    }
}
class MenuPicture: UIImageView {
    override var canBecomeFirstResponder: Bool {
        return true
    }
    
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        
        return super.canPerformAction(action, withSender: sender)
    }
}
class MenuLabel: UILabel {
    override var canBecomeFirstResponder: Bool {
        return true
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {

        return super.canPerformAction(action, withSender: sender)
    }
}

注意すべきことは、カスタマイズを継承するViewで、次の方法を実現することです.
   override var canBecomeFirstResponder: Bool {
        return true
    }
    
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if !isFirstResponder {
            //        ,           
            if action == #selector(handleCopyMessage(_:)) || action == #selector(handleRecallMessage(_:)) {
                return true
            }
            //      ,          
        }
        return super.canPerformAction(action, withSender: sender)
    }

handleCopyMessage(:)は自分で実現したcopyメソッドです
handleRecallMessage(:)は自分で実現した撤回方法です
    @objc func handleCopyMessage(_ menu: UIMenuController?) {
        let paste = UIPasteboard.general
        paste.string = messageLabel.text
    }
    
    @objc func handleRecallMessage(_ menu: UIMenuController?) {
        
        if recallMessageBlock != nil {
            recallMessageBlock!()
        }
    }

これにより、labelを定義し、copyと撤回を長押しで実現するのは簡単です.
    @IBOutlet weak var messageLabel: MenuLabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        
        messageLabel.isUserInteractionEnabled = true

        let longRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(cellLongPress(_:)))
        (messageLabel.superview ?? contentView).addGestureRecognizer(longRecognizer) //messageLabel.superview     label     ,      label  

   }

    @objc func cellLongPress(_ recognizer: UILongPressGestureRecognizer) {
        if recognizer.state == .began {
            if let message = self.message, message.type == .TextMessageType {
                if let label = messageLabel {
                    label.becomeFirstResponder()
                    let menu = UIMenuController.shared
                    let itCopy = UIMenuItem(title: getTranslation(textCode: "NT001") ?? "", action: #selector(self.handleCopyMessage(_:)))
let itRecall = UIMenuItem(title: getTranslation(textCode: "NT494") ?? "", action: #selector(self.handleRecallMessage(_:)))
                    menu.menuItems = [itCopy, itRecall]
                    menu.setTargetRect(label.frame, in: label.superview!)
                    if menu.isMenuVisible {
                        return
                    }
                    menu.setMenuVisible(true, animated: true)
                }
            }
        }
    }