我想在UILabel上使用原生iOS复制和粘贴UI

Bre*_*ski 3 uilabel uipasteboard ios swift

我想创建iOS时提供的本机复制和粘贴体验,当您点击并按住UITextField- 但我希望它可以在一个UILabel而不是一个UITextField.

这是可能的,还是只适用于它的东西UITextField?我是否需要创建自己的自定义用户界面并乱七八糟UIPasteboard或是否有更有说服力的解决方案?

这是一个典型的例子,虽然它通常也显示放大的圆圈:

它在文本字段中的外观的典型示例:

Kap*_*l G 8

标签上的标准复印菜单很难做到.或者也许当时我试过但没有成功.所以我刚刚实施了完整的复制解决方案.我做了类似下面的事情 -

import UIKit

class KGCopyableLabel: UILabel {

    override public var canBecomeFirstResponder: Bool {
        get {
            return true
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup() {
        isUserInteractionEnabled = true
        addGestureRecognizer(UILongPressGestureRecognizer(
            target: self,
            action: #selector(showCopyMenu(sender:))
        ))
    }

    override func copy(_ sender: Any?) {
        UIPasteboard.general.string = text
        UIMenuController.shared.setMenuVisible(false, animated: true)
    }

    func showCopyMenu(sender: Any?) {
        becomeFirstResponder()
        let menu = UIMenuController.shared
        if !menu.isMenuVisible {
            menu.setTargetRect(bounds, in: self)
            menu.setMenuVisible(true, animated: true)
        }
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return (action == #selector(copy(_:)))
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以简单地拖动Storyboard中的Label并使其成为KGCopyableLabel类型,它应该可以工作