2009-08-07 2 views
30
  1. Можем ли мы включить копию меню Вставить Вырезать для UILabel, как это для UITextField?Show iPhone вырезать копию меню наклеивают на UILabel

  2. Если нет, и мне нужно преобразовать UILabel в UITextField, как я могу включить меню вырезания скопированной копии и не разрешать изменение содержимого?

+0

Любая удача с опцией номером 2? В настоящее время я пытаюсь подключить подкласс UILabel для поддержки очень простого пункта меню копирования, это не особенно прямой процесс. –

ответ

3

Override textFieldShouldBeginEditing метода, UITextField экземпляра, и установить его вернуть NO, чтобы отключить редактирование.

Для получения более подробной информации ознакомьтесь с протоколом UITextFieldDelegate.

+0

Проблема в том, что копирование и вставка не будут работать, если вы отключите редактирование. – mrueg

+0

Работа с копиями, паста не работает. – Mugunth

+0

привет, Muguth, я пробовал это. Это не сработало. –

39

Я получил меню копирования & паста работает на UILabel, я просто должен был вернуться YES для canBecomeFirstResponder, а затем называют [label becomeFirstResponder], когда указанная метка должна была прийти на экране. Что касается возвращения YES из canBecomeFirstResponder, вы можете создать пользовательский подкласс или патч UILabel используя категорию:

@implementation UILabel (Clipboard) 

- (BOOL) canBecomeFirstResponder 
{ 
    return YES; 
} 

@end 

Решение категории чувствует себя немного хака, но если вы знаете, что вы делаете это может быть проще, чем подклассы , Я также установил sample project on GitHub, который показывает, как отобразить простое меню картона на UILabel.

+1

Я добавил некоторые дополнительные функции для репо zoul. https://github.com/zhbrass/UILabel-Clipboard – zhbrass

24

sample project on github Из-за ответа @ zoul это путь. На момент написания этого проекта этот проект фактически ничего не помещал в буфер обмена (картон). вот как: реализация

Изменить @ Zoul по этому способу:

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

Я раздвоенный образец проекта Zoul и добавлена ​​поддержка ARC (и несколько других функций), если кто-то по-прежнему заинтересованы:

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

CopyLabel.h/.м должно быть то, что вы ищу

+1

Молодцы. Большое спасибо. –

5

Я сделал с открытым исходным кодом UILabel подкласс, который показывает UIMenuController с опцией «Copy» при длительном нажатии:

HTCopyableLabel на GitHub

9

Для Swift 3 и Swift 4 вы должны реализовать этот класс:

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 
    } 
} 

В раскадровку просто подкласс UILabel с CopyableLabel класса

+1

Это отлично работает для меня. Благодаря! –

0

Swift 4 ☻ Xcode 9.2 Используя UIMenuController что мы можем сделай это.

Я создал IBDesignable Выборочная UILabel класс, который можно назначить на раскадровку непосредственно

@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 
    } 
} 

Выход:

enter image description here