2009-08-07 12 views
30
  1. Können wir das Cut Copy Paste Menü ermöglichen ein UILabel wie es für ein UITextField ist?anzeigen iPhone schneiden Kopieren und Einfügen-Menü auf UILabel

  2. Wenn nicht, und ich muss meine UILabel in UITextField konvertieren, wie kann ich das Ausschneiden Kopieren einfügen Menü aktivieren und nicht zulassen, dass der Inhalt geändert werden?

+0

Glück gehabt mit der Option Nummer 2? Ich versuche gerade, eine UILabel-Unterklasse zu verkabeln, um eine sehr einfache Kopiermenüoption zu unterstützen, es ist kein besonders einfacher Prozess. –

Antwort

3

überschreiben die UITextFieldtextFieldShouldBeginEditing Methode der Instanz, und setzt es NO zurückzukehren, um die Bearbeitung zu deaktivieren.

Weitere Details finden Sie im Protokoll UITextFieldDelegate.

+0

Das Problem ist: Kopieren und Einfügen funktioniert nicht, wenn Sie die Bearbeitung deaktivieren. – mrueg

+0

Kopieren funktioniert, Einfügen funktioniert nicht. – Mugunth

+0

Hallo Muguth, ich habe das versucht. Es hat nicht funktioniert. –

39

ich die Kopie & Paste Menü auf einem UILabel Arbeits bekam, musste ich einfach YES für canBecomeFirstResponder zurückzukehren und [label becomeFirstResponder] später anrufen, wenn das das Etikett auf dem Bildschirm zu kommen war. Was YES von canBecomeFirstResponder Rückkehr, können Sie eine benutzerdefinierte Unterklasse UILabel mit einer Kategorie erstellen oder patchen:

@implementation UILabel (Clipboard) 

- (BOOL) canBecomeFirstResponder 
{ 
    return YES; 
} 

@end 

Die Kategorie-Lösung ein bisschen hackish fühlt, aber wenn Sie wissen, was Sie tun könnte es einfacher sein als Subklassen . Ich habe auch eine sample project on GitHub, die zeigt, wie ein einfaches Pasteboard-Menü auf einem UILabel angezeigt wird.

+1

Ich habe einige zusätzliche Funktionen zu Zoul's Repo hinzugefügt. https://github.com/zhbrass/UILabel-Clipboard – zhbrass

24

Die sample project on github aufgrund @ Zouls Antwort ist der Weg zu gehen. Zum Zeitpunkt dieses Schreibens legt dieses Projekt nichts in die Zwischenablage (Pappe). hier ist, wie:

ändern @ Zoul Implementierung dieses Verfahrens:

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

Ich habe Zoul das Beispielprojekt gegabelt und Unterstützung für ARC (und ein paar andere Funktionen), wenn noch jemand interessiert ist:

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

CopyLabel.h/.m sollte das sein, was du bist Suche

+1

Gut gemacht. Vielen Dank. –

5

habe ich eine Open-Source-UILabel Unterklasse gebildet, die eine UIMenuController mit einer Option "Kopieren" auf lange drücken zeigt:

HTCopyableLabel auf GitHub

9

Für Swift 3 und Swift 4 Sie haben diese Klasse zu implementieren:

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 { 

     if action == #selector(UIResponderStandardEditActions.copy) { 
      return true 
     } 

     return false 
    } 
} 

In Storyboard Unterklasse nur die UILabel mit CopyableLabel Klasse

+1

Das funktioniert perfekt für mich. Vielen Dank! –

0

Swift 4 ☻ Xcode 9.2 Durch UIMenuController verwenden wir können TU es.

I IBDesignable Benutzerdefinierte UILabel Klasse erstellt haben, die Sie auf 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 
    } 
} 

Ausgang direkt zuordnen können:

enter image description here

Verwandte Themen