在UILabel上显示iPhone剪切复制粘贴菜单

45 iphone cocoa-touch ios swift

  1. 我们可以启用一个剪切复制粘贴菜单UILabel,因为它是一个UITextField

  2. 如果没有,我需要转换UILabelUITextField,我如何启用剪切复制粘贴菜单,不允许修改内容?

zou*_*oul 40

我得到了复制和粘贴菜单UILabel,我只需要返回YES,canBecomeFirstResponder然后[label becomeFirstResponder]在屏幕上显示所述标签时再打电话.至于回国YEScanBecomeFirstResponder,您可以创建自定义的子类或修补UILabel使用类别:

@implementation UILabel (Clipboard)

- (BOOL) canBecomeFirstResponder
{
    return YES;
}

@end
Run Code Online (Sandbox Code Playgroud)

类别解决方案感觉有点hackish,但如果你知道你正在做什么,它可能比继承更容易.我还在GitHub上展示了一个示例项目,项目展示了如何在一个简单的粘贴板菜单上显示UILabel.


pab*_*ros 31

对于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 {
        return action == #selector(UIResponderStandardEditActions.copy)
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的故事板刚子类UILabelCopyableLabel


ben*_*ioT 25

由于@ zoul的回答,github上示例项目是要走的路.在撰写本文时,该项目实际上并未在剪贴板(粘贴板)上放置任何内容.这是如何:

将@ zoul的此方法实现更改为:

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


Jac*_*ack 11

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
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

  • 您应该使用'guardognir.state ==。开始否则{return}`这样,它将在持续时间之后而不是在您松开手指之后显示菜单控制器。用户期望在他们的手指被按下时得到反馈。 (2认同)

jon*_*ley 6

我已经创建了一个开源UILabel子类,它显示了长按时带有"复制"选项的UIMenuController:

GitHub上的HTCopyableLabel


zhb*_*ass 5

如果有人仍然感兴趣的话,我已经分享了zoul的示例项目并增加了对ARC(以及其他一些功能)的支持:

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

CopyLabel.h/.m应该是您正在寻找的


Ale*_*lds 2

重写UITextField实例的textFieldShouldBeginEditing方法,并将其设置为 returnNO以禁用编辑。

查看UITextFieldDelegate协议以了解更多详细信息。