项目中遇到需要拷贝文本链接的需求,相当然是通过继承子类化实现, 灵光一闪通过扩展最终完美实现,效果如下:

使用:
lazy var label: UILabel = {
let view = UILabel(frame: .zero)
view.addLongPressMenuItems()
// UIMenuController.shared.menuItems = menuItems
view.text = "这是一调测试信息"
view.backgroundColor = UIColor.background
return view
}()
//扩展实现
@objc public extension UILabel{
func addLongPressMenuItems() {
isUserInteractionEnabled = true
let recognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleMenuItems(_:)));
addGestureRecognizer(recognizer)
}
// MARK: -funtions
@objc func handleMenuItems(_ recognizer: UIGestureRecognizer) {
guard let recognizerView = recognizer.view,
let recognizerSuperView = recognizerView.superview
else { return }
if #available(iOS 13.0, *) {
UIMenuController.shared.showMenu(from: recognizerSuperView, rect: recognizerView.frame)
} else {
UIMenuController.shared.setTargetRect(recognizerView.frame, in: recognizerSuperView)
UIMenuController.shared.setMenuVisible(true, animated: true)
}
recognizerView.becomeFirstResponder()
}
// MARK: -edit menu
override var canBecomeFirstResponder: Bool {
return true
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
guard let menuItems = UIMenuController.shared.menuItems else { return [#selector(copy(_:))].contains(action)}
let actions: [Selector] = menuItems.map { $0.action }
return actions.contains(action)
}
// MARK: - UIResponderStandardEditActions
override func copy(_ sender: Any?) {
UIPasteboard.general.string = text
}
override func paste(_ sender: Any?) {
text = UIPasteboard.general.string
}
override func delete(_ sender: Any?) {
text = ""
}
}
网友评论