美文网首页
iOS UILabel 利用编辑菜单实现内容拷贝

iOS UILabel 利用编辑菜单实现内容拷贝

作者: SoaringHeart | 来源:发表于2020-05-28 15:10 被阅读0次

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

Simulator Screen Shot - iPhone 6s Plus - 2020-05-28 at 14.53.48.png
使用:
    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 = ""
    }
}

相关文章

  • iOS UILabel 利用编辑菜单实现内容拷贝

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

  • macOS NSTextField与UILabel

    在iOS中实现不可编辑的文本有UILabel控件,在macOS中则使用NSTextField或者NSTextVie...

  • 字符串区分颜色和大小

    iOS利用NSAttributeString实现不同颜色大小显示的方法 一个UILabel显示不同大小颜色的字符串...

  • iOS 深拷贝,完全深拷贝(三)

    iOS 深、浅拷贝NSArray、NSMutableArray(二)挖坑的内容 上两篇,主要是讲了深、浅拷贝实现,...

  • UILabel两边对齐的实现(NSAttributedStrin

    标签(空格分隔): ios UILabel 最近有需求要让UILabel 实现两边的对齐,我们知道UIlabel默...

  • Swift3.0-简单的吐司提示

    利用GCD和UILabel实现,代码如下 //设置登录成功提示 let label = UILabel.init(...

  • iOS知识点

    1 iOS基础 1.1 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 1....

  • 虐你千百遍的iOS开发基础知识

    1 iOS基础 1.1 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷...

  • 基础题

    1 iOS基础 1.1 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷...

  • vue学习笔记--v-for渲染动态选项

    目标:实现一个点选下拉菜单后,选择的菜单项显示在特定位置原理:利用v-for 循环显示下拉菜单的内容,然后再利用v...

网友评论

      本文标题:iOS UILabel 利用编辑菜单实现内容拷贝

      本文链接:https://www.haomeiwen.com/subject/yvhaahtx.html