2017-08-07 4 views
1

Je veux créer la native Copier et coller expérience iOS fournit lorsque vous appuyez sur et maintenez un UITextField - mais je veux que cela fonctionne sur un UILabel au lieu d'un UITextField.Je veux iOS natif copier et coller l'interface utilisateur sur UILabel

Est-ce possible ou est-ce quelque chose qui ne fonctionne qu'avec UITextField? Aurais-je besoin de créer ma propre interface utilisateur personnalisée et de jouer dans UIPasteboard ou y at-il une solution plus éloquente?

Voici un exemple typique, bien que normalement montre aussi le zoomé cercle:

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

+0

[Cet article] (http: // stephenradford .me/make-uilabel-copyable /) vous aidera –

+0

Merci, cela pourrait fonctionner pour la partie Copie de mon problème. – Brewski

Répondre

2

Il est difficile de faire le menu standard de copie sur l'étiquette. Ou peut-être à ce moment-là j'ai essayé mais n'ai pas réussi. J'ai donc implémenté une solution de copie complète. Je l'ai fait quelque chose comme ci-dessous -

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

Vous pouvez alors simple glisser-déposer l'étiquette dans Storyboard et faire du type KGCopyableLabel et il devrait fonctionner

+0

Merci, cela fonctionnera pour la copie. Je suppose que pour que le Coller fonctionne, je devrais convertir mon 'UILabel' en un 'UITextfield'. – Brewski