diff --git a/Metatext.xcodeproj/project.pbxproj b/Metatext.xcodeproj/project.pbxproj index eb26031..7d4891c 100644 --- a/Metatext.xcodeproj/project.pbxproj +++ b/Metatext.xcodeproj/project.pbxproj @@ -40,6 +40,7 @@ D025B15B25C4EA7D001C69A8 /* ImageCacheConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D025B14C25C4E482001C69A8 /* ImageCacheConfiguration.swift */; }; D025B16A25C4EB18001C69A8 /* ServiceLayer in Frameworks */ = {isa = PBXBuildFile; productRef = D025B16925C4EB18001C69A8 /* ServiceLayer */; }; D025B17E25C500BC001C69A8 /* CapsuleButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D025B17D25C500BC001C69A8 /* CapsuleButton.swift */; }; + D02D338D25EDA593000A35CC /* CopyableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02D338C25EDA593000A35CC /* CopyableLabel.swift */; }; D02E1F95250B13210071AD56 /* SafariView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D02E1F94250B13210071AD56 /* SafariView.swift */; }; D035D8F925E4338D00E597C9 /* ImageDiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035D8F825E4338D00E597C9 /* ImageDiskCache.swift */; }; D035D8FE25E4339800E597C9 /* ImageDiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = D035D8F825E4338D00E597C9 /* ImageDiskCache.swift */; }; @@ -277,6 +278,7 @@ D021A63525C38ADB008A0C0D /* AcknowledgmentsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcknowledgmentsView.swift; sourceTree = ""; }; D025B14C25C4E482001C69A8 /* ImageCacheConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageCacheConfiguration.swift; sourceTree = ""; }; D025B17D25C500BC001C69A8 /* CapsuleButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CapsuleButton.swift; sourceTree = ""; }; + D02D338C25EDA593000A35CC /* CopyableLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyableLabel.swift; sourceTree = ""; }; D02E1F94250B13210071AD56 /* SafariView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariView.swift; sourceTree = ""; }; D035D8F825E4338D00E597C9 /* ImageDiskCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageDiskCache.swift; sourceTree = ""; }; D035F86825B7F2ED00DC75ED /* MainNavigationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainNavigationViewController.swift; sourceTree = ""; }; @@ -490,6 +492,7 @@ D021A67025C3E204008A0C0D /* Content Configurations */, D021A67125C3E232008A0C0D /* Content Views */, D007023D25562A2800F38136 /* ConversationAvatarsView.swift */, + D02D338C25EDA593000A35CC /* CopyableLabel.swift */, D05936DD25A937EC00754FDF /* EditThumbnailView.swift */, D07EC7FC25B16994006DF726 /* EmojiCategoryHeaderView.swift */, D0CEC11F25E35FE100FEF5A6 /* EmojiInsertable.swift */, @@ -1059,6 +1062,7 @@ D0477F2C25C6EBAD005C5368 /* OpenInDefaultBrowserActivity.swift in Sources */, D0DD50CB256B1F24004A04F7 /* ReportView.swift in Sources */, D07F4D9825D493E300F61133 /* MuteView.swift in Sources */, + D02D338D25EDA593000A35CC /* CopyableLabel.swift in Sources */, D097F41B25BE3E1A00859F2C /* SearchScope+Extensions.swift in Sources */, D0CEC10125E337C900FEF5A6 /* AnimatedTextAttachment.swift in Sources */, D035F8B325B9616000DC75ED /* Timeline+Extensions.swift in Sources */, diff --git a/Views/UIKit/AccountHeaderView.swift b/Views/UIKit/AccountHeaderView.swift index 0ca588b..8c13ff4 100644 --- a/Views/UIKit/AccountHeaderView.swift +++ b/Views/UIKit/AccountHeaderView.swift @@ -19,7 +19,7 @@ final class AccountHeaderView: UIView { let unnotifyButton = UIButton() let displayNameLabel = AnimatedAttachmentLabel() let accountStackView = UIStackView() - let accountLabel = UILabel() + let accountLabel = CopyableLabel() let lockedImageView = UIImageView() let followsYouLabel = CapsuleLabel() let mutedLabel = CapsuleLabel() diff --git a/Views/UIKit/CopyableLabel.swift b/Views/UIKit/CopyableLabel.swift new file mode 100644 index 0000000..baaa0dc --- /dev/null +++ b/Views/UIKit/CopyableLabel.swift @@ -0,0 +1,39 @@ +// Copyright © 2021 Metabolist. All rights reserved. + +import UIKit + +final class CopyableLabel: UILabel { + override init(frame: CGRect) { + super.init(frame: frame) + + isUserInteractionEnabled = true + addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(showCopyMenu(sender:)))) + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override var canBecomeFirstResponder: Bool { true } + + override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { + action == #selector(UIResponderStandardEditActions.copy(_:)) + } + + override func copy(_ sender: Any?) { + UIPasteboard.general.string = text + } +} + +private extension CopyableLabel { + @objc func showCopyMenu(sender: Any) { + becomeFirstResponder() + + let menuController = UIMenuController.shared + + if !menuController.isMenuVisible { + menuController.showMenu(from: self, rect: bounds) + } + } +}