I want to create the native Copy and Paste experience that iOS provides when you tap and hold a UITextField
- but I want it to work on a UILabel
instead of a UITextField
.
Is this possible, or is it something that only works with UITextField
?
Would I need to create my own custom UI and mess around in UIPasteboard
or is there a more eloquent solution?
Here is a typical example, although it normally also shows the zoomed in circle:
It is difficult to do the standard copy menu on the label. Or maybe at that time I tried but didnt succeed. So I just implemented a complete copy solution. I did it something like below:
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.hideMenu()
}
@objc func showCopyMenu(sender: Any?) {
becomeFirstResponder()
let menu = UIMenuController.shared
if !menu.isMenuVisible {
menu.showMenu(from: self, rect: bounds)
}
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return (action == #selector(copy(_:)))
}
}
You can then simple drag drop the label in Storyboard and make its type KGCopyableLabel
and it should work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With