// // Copyright 2021 New Vector Ltd // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // import UIKit /// Enables to copy text content of the label /// https://stackoverflow.com/a/62978837 class CopyableLabel: UILabel { // MARK: - Setup 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))) } // MARK: - Public @objc func showMenu(sender: AnyObject?) { self.becomeFirstResponder() let menu = UIMenuController.shared if !menu.isMenuVisible { if #available(iOS 13.0, *) { menu.showMenu(from: self, rect: self.bounds) } } } // MARK: - Overrides override func copy(_ sender: Any?) { let board = UIPasteboard.general board.string = self.text // Note that the UIMenuController will be dismissed by itself after copying the text } override var canBecomeFirstResponder: Bool { return true } override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return action == #selector(UIResponderStandardEditActions.copy) } }