iOS長押し弾枠、メニューバー
UIView,UIButton,UIImageViewなどを書き換え,各種コントロールを長押しするポップアップメニューバーを実現する
注意すべきことは、カスタマイズを継承するViewで、次の方法を実現することです.
handleCopyMessage(:)は自分で実現したcopyメソッドです
handleRecallMessage(:)は自分で実現した撤回方法です
これにより、labelを定義し、copyと撤回を長押しで実現するのは簡単です.
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)
}
}
}
}