Mostrar o menu de copiar copiar e colar do iPhone na UILabel

  1. Podemos habilitar o menu de colar de cópia recortada para um UILabel como é para um UITextField ?

  2. Se não, e eu preciso converter meu UILabel para UITextField , como posso habilitar o menu Colar Copiar Copiar e não permitir que o conteúdo seja modificado?

Eu tenho o menu copiar e colar trabalhando em um UILabel , eu só tinha que retornar YES para canBecomeFirstResponder e depois chamar [label becomeFirstResponder] quando o referido label era para entrar na canvas. Quanto a retornar YES de canBecomeFirstResponder , você pode criar uma subclass personalizada ou um patch UILabel usando uma categoria:

 @implementation UILabel (Clipboard) - (BOOL) canBecomeFirstResponder { return YES; } @end 

A solução da categoria parece um pouco trabalhosa, mas se você souber o que está fazendo, pode ser mais fácil do que subclassificar. Eu também coloquei um projeto de amostra no GitHub que mostra como exibir um menu simples de pasteboard em um UILabel .

O exemplo de projeto no github, devido à resposta do @zoul, é o caminho a seguir. No momento da redação deste artigo, esse projeto não coloca nada na área de transferência (papelão). aqui está como:

Altere a implementação de @ zoul deste método para:

 - (void) copy:(id)sender { UIPasteboard *pboard = [UIPasteboard generalPasteboard]; pboard.string = self.text; } 

Para o Swift 3 e Swift 4 você tem que implementar esta class:

 import UIKit class CopyableLabel: UILabel { override init(frame: CGRect) { super.init(frame: frame) self.sharedInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.sharedInit() } func sharedInit() { self.isUserInteractionEnabled = true self.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(self.showMenu))) } @objc func showMenu(sender: AnyObject?) { self.becomeFirstResponder() let menu = UIMenuController.shared if !menu.isMenuVisible { menu.setTargetRect(bounds, in: self) menu.setMenuVisible(true, animated: true) } } override func copy(_ sender: Any?) { let board = UIPasteboard.general board.string = text let menu = UIMenuController.shared menu.setMenuVisible(false, animated: true) } override var canBecomeFirstResponder: Bool { return true } override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return action == #selector(UIResponderStandardEditActions.copy) } } 

No seu storyboard, apenas subclass a UILabel com a class CopyableLabel

Eu fiz uma subclass de código-fonte aberto UILabel que mostra um UIMenuController com uma opção “Copiar” ao pressionar longamente:

HTCopyableLabel no GitHub

Eu bifurquei o projeto de amostra do zoul e adicionei suporte para o ARC (e alguns outros resources) se alguém ainda estiver interessado:

https://github.com/zhbrass/UILabel-Clipboard

CopyLabel.h / .m deve ser o que você está procurando

Substitua o método textFieldShouldBeginEditing da instância do UITextField e defina-o para retornar NO para desativar a edição.

Dê uma olhada no protocolo UITextFieldDelegate para mais detalhes.

Se você tiver texto de UITextView , você deve usar o UITextView

Defina o delegado:

 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { return false } 

E isso deve funcionar magicamente 🙂

O projeto do github do benvolioT é um bom exemplo para copiar. E para colar, personalize canPerformAction:withSender: Para mais, veja o exemplo CopyPasteTile .

Swift 4 ☻ Xcode 9.2 . Usando o UIMenuController , podemos fazer isso.

Eu criei a class IBDesignable Custom UILabel que você pode atribuir diretamente no storyboard

 @IBDesignable class TapAndCopyLabel: UILabel { override func awakeFromNib() { super.awakeFromNib() //1.Here i am Adding UILongPressGestureRecognizer by which copy popup will Appears let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPressGesture(_:))) self.addGestureRecognizer(gestureRecognizer) self.isUserInteractionEnabled = true } // MARK: - UIGestureRecognizer @objc func handleLongPressGesture(_ recognizer: UIGestureRecognizer) { guard recognizer.state == .recognized else { return } if let recognizerView = recognizer.view, let recognizerSuperView = recognizerView.superview, recognizerView.becomeFirstResponder() { let menuController = UIMenuController.shared menuController.setTargetRect(recognizerView.frame, in: recognizerSuperView) menuController.setMenuVisible(true, animated:true) } } //2.Returns a Boolean value indicating whether this object can become the first responder override var canBecomeFirstResponder: Bool { return true } //3.Here we are enabling copy action override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return (action == #selector(UIResponderStandardEditActions.copy(_:))) } // MARK: - UIResponderStandardEditActions override func copy(_ sender: Any?) { //4.copy current Text to the paste board UIPasteboard.general.string = text } } 

Saída:

insira a descrição da imagem aqui