From 33865750b9c1229f6e830ba85e7639eff07e0876 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 7 Dec 2024 15:08:08 -0800 Subject: [PATCH] Fix several warnings. --- iOS/UIKit Extensions/InteractiveLabel.swift | 40 ++++++++++++++------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/iOS/UIKit Extensions/InteractiveLabel.swift b/iOS/UIKit Extensions/InteractiveLabel.swift index 89ae25d1c..989412278 100644 --- a/iOS/UIKit Extensions/InteractiveLabel.swift +++ b/iOS/UIKit Extensions/InteractiveLabel.swift @@ -9,33 +9,38 @@ import UIKit @IBDesignable -class InteractiveLabel: UILabel { +class InteractiveLabel: UILabel, UIEditMenuInteractionDelegate { override init(frame: CGRect) { super.init(frame: frame) commonInit() } - + required init?(coder: NSCoder) { super.init(coder: coder) commonInit() } - + func commonInit() { let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPressGesture(_:))) self.addGestureRecognizer(gestureRecognizer) + + let editMenuInteraction = UIEditMenuInteraction(delegate: self) + addInteraction(editMenuInteraction) + self.isUserInteractionEnabled = true } @objc func handleLongPressGesture(_ recognizer: UIGestureRecognizer) { - guard recognizer.state == .began, - let recognizerView = recognizer.view, - let recognizerSuperView = recognizerView.superview, - recognizerView.becomeFirstResponder() else { - return + guard recognizer.state == .began, let recognizerView = recognizer.view else { + return + } + + if let interaction = recognizerView.interactions.first(where: { $0 is UIEditMenuInteraction }) as? UIEditMenuInteraction { + let location = recognizer.location(in: recognizerView) + let editMenuConfiguration = UIEditMenuConfiguration(identifier: nil, sourcePoint: location) + interaction.presentEditMenu(with: editMenuConfiguration) } - - UIMenuController.shared.showMenu(from: recognizerSuperView, rect: recognizerView.frame) } override var canBecomeFirstResponder: Bool { @@ -44,11 +49,20 @@ class InteractiveLabel: UILabel { override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { return (action == #selector(UIResponderStandardEditActions.copy(_:))) - } - + override func copy(_ sender: Any?) { UIPasteboard.general.string = text } - + + // MARK: - UIEditMenuInteractionDelegate + + func editMenuInteraction(_ interaction: UIEditMenuInteraction, menuFor configuration: UIEditMenuConfiguration, suggestedActions: [UIMenuElement]) -> UIMenu? { + + let copyAction = UIAction(title: "Copy", image: nil) { [weak self] action in + self?.copy(nil) + } + return UIMenu(title: "", children: [copyAction]) + } } +