UIMenuController的基本使用

如果你的App是一个阅读类的或是可预见用户会经常拷贝App里面的内容的时候,App的的复制功能就尤其显得重要。iOS中,复制功能并没有直接集成到控件当中,如果你的App需要该功能需要重写该控件并实现相应的功能。

实现步骤

1、必须要继承 UILabel,并且在子类中实现 canBecomeFirstResponder 和 canPerformAction:withSender: 方法
2、每个可以执行的操作,都要实现一个对应的方法,并且在方法中和 UIPasteboard 进行交互,
当在控制器中被初始化时,label 必须把 userInteractionEnabled 属性设置为 YES(不推荐把这个操作硬编码到子类的实现中)
3、label 中必须添加一个 UIGestureRecognizer(或者手动在子类中实现 UIResponder 的方法,例如 touchesBegan:withEvent:)
4、在响应手势识别事件的函数实现中,需要指定 UIMenuController 显示的位置,并且设为可见
最后,label 必须要成为第一响应者(first responder)
//第一步
class DIYLabel : UILabel {
    override func canBecomeFirstResponder() -> Bool {
        return true
    }
    
    override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
        return (action == "copy:")
    }
    
    // MARK: - UIResponderStandardEditActions
    override func copy(sender: AnyObject?) {
        UIPasteboard.generalPasteboard().string = text
    }
}
override func viewDidLoad() {
    super.viewDidLoad()
        //第二步
    let label: DIYLabel = ...
    label.userInteractionEnabled = true
    view.addSubview(label)
        //第三步
    let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:")
    label.addGestureRecognizer(gestureRecognizer)
}

// MARK: - UIGestureRecognizer
func handleLongPressGesture(recognizer: UIGestureRecognizer) {
    if let recognizerView = recognizer.view,
        recognizerSuperView = recognizerView.superview
    {
                //第四步
        let menuController = UIMenuController.sharedMenuController()
        menuController.setTargetRect(recognizerView.frame, inView: recognizerSuperView)
        menuController.setMenuVisible(true, animated:true)
        recognizerView.becomeFirstResponder()
    }
}

另外:

在 iOS 3.2 上,开发者可以向菜单控制器中添加自定义的命令。之前没有提到的类似“定义”或者拼写检查建议这些大家很熟悉的命令,就是利用了这一特性。
UIMenuController 有一个 menuItems 属性,是一个包含 UIMenuItem 对象的 NSArray。每一个 UIMenuItem 对象都有一个 title 和 action。为了让这个菜单项命令能在菜单控制器中显示,响应者必须实现对应的方法选择器。

你可能感兴趣的:(UIMenuController的基本使用)