我想在UILabel

时间:2017-08-07 07:10:53

标签: ios swift uilabel uipasteboard

我想创建iOS点击并按住UITextField时提供的原生复制和粘贴体验 - 但我希望它能够在UILabel而不是UITextField上工作一个UITextField

这是可能的,还是仅适用于UIPasteboard的东西?  我是否需要创建自己的自定义用户界面并在this.router.navigate(['info'], {relativeTo: this.route})中乱七八糟,还是有更有说服力的解决方案?

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

A typical example of how it looks on a text field:

1 个答案:

答案 0 :(得分:6)

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

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(_:)))
    }
}

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