UIMenuController

一、简介

什么是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
    }
}

运行效果如下:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容