2016-10-11 3 views

Antwort

2

Ja, Sie müssen einen UIMenuController mit einer langen Druckgeste implementieren, die auf Ihr UILabel angewendet wurde. Es gibt einen ausgezeichneten Artikel dazu auf NSHipster, aber der Kern des Artikels ist der folgende.

eine Unterklasse von UILabel erstellen und die folgenden Methoden implementieren:

override func canBecomeFirstResponder() -> Bool { 
    return true 
} 

override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { 
    return (action == "copy:") 
} 

// MARK: - UIResponderStandardEditActions 

override func copy(sender: AnyObject?) { 
    UIPasteboard.generalPasteboard().string = text 
} 

Dann in Ihrem View-Controller, können Sie einen langen Druck Geste zu Ihrem Label hinzufügen:

let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:") 
label.addGestureRecognizer(gestureRecognizer) 

und behandeln die lange Drücken Sie mit dieser Methode:

func handleLongPressGesture(recognizer: UIGestureRecognizer) { 
    if let recognizerView = recognizer.view, 
     recognizerSuperView = recognizerView.superview 
    { 
     let menuController = UIMenuController.sharedMenuController() 
     menuController.setTargetRect(recognizerView.frame, inView: recognizerSuperView) 
     menuController.setMenuVisible(true, animated:true) 
     recognizerView.becomeFirstResponder() 
    }} 

HINWEIS: Dieser Code wird direkt aus t übernommen Der NSHipster-Artikel, ich füge ihn hier nur für die SO-Konformität ein.

+1

Sie müssen auch Benutzerinteraktionen auf dem Etikett aktivieren. Ohne diese wird die Geste niemals erkannt werden. Außerdem ist es wichtig, den Status der Geste in der Methode 'handleLongPressGesture' zu ​​überprüfen. Dieser NSHipster Artikel macht einen schrecklichen Job, indem er das nicht richtig macht. – rmaddy

+0

das auch gefunden :) http://stephenradford.me/make-uilabel-copyable/ – user2636197

0

UILabel erbt von UIView, sodass Sie dem Label einfach einen langen Gestenerkenner hinzufügen können. Beachten Sie, dass Sie isUserInteractionEnabled in "true" ändern müssen, da für Labels standardmäßig false angegeben wird.

import UIKit 

    class ViewController: UIViewController { 
     let label = UILabel() 

     override func viewDidLoad() { 
      view.addSubview(label) 
      label.text = "hello" 
      label.translatesAutoresizingMaskIntoConstraints = false 
      label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
      label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
      let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressLabel(longPressGestureRecognizer:))) 
      label.addGestureRecognizer(longPressGestureRecognizer) 
      label.isUserInteractionEnabled = true 
     } 

     @objc private func longPressLabel (longPressGestureRecognizer: UILongPressGestureRecognizer) { 
      if longPressGestureRecognizer.state == .began { 
       print("long press began") 
      } else if longPressGestureRecognizer.state == .ended { 
       print("long press ended") 
      } 

     } 

    } 
+0

das auch gefunden http://stephenradford.me/make-uilabel-copyable/ :) – user2636197

-1

Ich habe eine UILabel Unterklasse implementiert, benötigt die gesamte Funktionalität zur Verfügung stellt. Beachten Sie, dass Sie die Methoden init anpassen müssen, wenn Sie dies mit dem Schnittstellen-Generator verwenden.

/// A label that can be copied. 
class CopyableLabel: UILabel 
{ 
    // MARK: - Initialisation 

    /// Creates a new label. 
    init() 
    { 
     super.init(frame: .zero) 

     let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPressGesture(_:))) 
     self.addGestureRecognizer(gestureRecognizer) 

     self.isUserInteractionEnabled = true 
    } 

    required init?(coder aDecoder: NSCoder) 
    { 
     fatalError("init(coder:) has not been implemented") 
    } 

    // MARK: - Responder chain 

    override var canBecomeFirstResponder: Bool 
    { 
     return true 
    } 

    // MARK: - Actions 

    /// Method called when a long press is triggered. 
    func handleLongPressGesture(_ gestuerRecognizer: UILongPressGestureRecognizer) 
    { 
     guard let superview = self.superview else { return } 

     let menuController = UIMenuController.shared 
     menuController.setTargetRect(self.frame, in: superview) 
     menuController.setMenuVisible(true, animated:true) 
     self.becomeFirstResponder() 
    } 

    override func copy(_ sender: Any?) 
    { 
     UIPasteboard.general.string = self.text 
    } 
} 
Verwandte Themen