一、简介
什么是UIMenuController?UIMenuController是UIKit里面的控件,当苹果在 iOS 3.0 中增加了剪切、复制和粘贴功能时,它同时为开发者提供了 UIMenuController 组件用来定制该弹出菜单,也就是说从iOS 3.0开始就可以使用了,效果图如下:
二、实现
例如想让Label显示Menu,则必须新建一个文件继承于UILabel
import UIKit
class MenuLabel: UILabel {
override func awakeFromNib() {
super.awakeFromNib()
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
//fatalError("init(coder:) has not been implemented")
super.init(coder: aDecoder)
setup()
}
// 让label有资格成为第一响应者
override var canBecomeFirstResponder: Bool {
return true
}
private func setup() {
// 初始化Label,让Label能响应用户交互,并添加一个点击手势
isUserInteractionEnabled = true
addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(labelClick)))
}
@objc private func labelClick() {
becomeFirstResponder()
// MenuController是一个单例
let menu = UIMenuController.shared
// 设置显示在哪个view上
menu.setTargetRect(bounds, in: self)
// 显示MenuController
menu.setMenuVisible(true, animated: true)
}
// label能执行哪些操作(比如这里只支持copy,paste,cut这三种操作),
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(cut(_:)) || action == #selector(copy(_:)) || action == #selector(paste(_:)) {
return true
}
return false
}
// 复制
override func copy(_ sender: Any?) {
// 有文字才能复制
if text != nil {
// 将文字复制到粘贴板
let board = UIPasteboard.general
board.string = text
}
}
// 剪切
override func cut(_ sender: Any?) {
copy(sender)
text = nil
}
// 粘贴
override func paste(_ sender: Any?) {
// 将粘贴板的文字赋值给label
let board = UIPasteboard.general
text = board.string
}
}
运行效果如下: