Я хочу скопировать и вставить собственный пользовательский интерфейс iOS на UILabel

Я хочу создать нативную функцию Копировать и вставить, которую предоставляет iOS, когда вы нажимаете и удерживаете UITextField, но я хочу, чтобы она работала с UILabel, а не с UITextField.

Возможно ли это, или это работает только с UITextField? Нужно ли мне создавать свой собственный пользовательский интерфейс и возиться с UIPasteboard или есть более красноречивое решение?

Вот типичный пример, хотя обычно он также показывает увеличенный круг:

Типичный пример того, как это выглядит в текстовом поле:


person Brewski    schedule 07.08.2017    source источник
comment
Эта статья поможет вам   -  person Anh Pham    schedule 07.08.2017
comment
Спасибо, это может сработать для части копирования моей проблемы.   -  person Brewski    schedule 07.08.2017


Ответы (1)


Сложно сделать стандартное копирование меню на этикетке. Или, может быть, в то время я пытался, но не удалось. Поэтому я только что реализовал полное решение для копирования. Я сделал это примерно так:

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.hideMenu()
    }

    @objc func showCopyMenu(sender: Any?) {
        becomeFirstResponder()
        let menu = UIMenuController.shared
        if !menu.isMenuVisible {
            menu.showMenu(from: self, rect: bounds)
        }
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return (action == #selector(copy(_:)))
    }
}

Затем вы можете просто перетащить метку в раскадровке и сделать ее тип KGCopyableLabel, и она должна работать.

person Kapil G    schedule 07.08.2017
comment
Спасибо, это будет работать для копирования. Я думаю, чтобы заставить Paste работать, мне нужно будет преобразовать мой «UILabel» в «UITextfield». - person Brewski; 07.08.2017
comment
да, вам нужно uitextfield для редактируемого текста - person Jagveer Singh; 03.02.2021