実行環境
Swift | 5.6.1 |
Xcode | 13.4 |
実装
作ったもの
下の動画のように、
設置したUILabelを長押しタップもしくは、タップでコピーするコードを紹介します。
実装の概要
どうやら、UIMenueControllerを利用して実装させるらしい。
UIMenueController のApple公式ドキュメントを引用してみました。
[切り取り]、[コピー]、[貼り付け]、[選択]、[すべて選択]、および[削除]コマンドのメニューインターフェイス。Apple公式ドキュメント:UIMenueController
公式ドキュメントから分かることとして、
Lineでいうと下記のように「コピー」のボタンが実装できたりするのでしょう。
コレ以外にも、「切り取り」とか色々できるみたいなので、使い所は多そうですね。
実装方法
まず、「CopyUILabel」のクラスを作成します。
作成したクラスに下記のコードを記述しましょう。
import UIKit
class CopyUILabel: UILabel {
override init(frame: CGRect) {
super.init(frame: frame)
self.copyInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.copyInit()
}
func copyInit() {
self.isUserInteractionEnabled = true
// 長押しコピー
//self.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(CopyUILabel.showMenu(sender:))))
// 軽くタッチコピー
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(CopyUILabel.showMenu(sender:))))
}
@objc func showMenu(sender:AnyObject?) {
self.becomeFirstResponder()
let contextMenu = UIMenuController.shared
if !contextMenu.isMenuVisible {
contextMenu.showMenu(from: self, rect: self.bounds)
}
}
override func copy(_ sender: Any?) {
let pasteBoard = UIPasteboard.general
pasteBoard.string = text
}
override var canBecomeFirstResponder: Bool {
return true
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return action == #selector(UIResponderStandardEditActions.copy)
}
}
クラスが完成したら、
コピー機能を付与したいLabelのClassに、先程作成した「CopyUILabel」を指定します。
たったこれだけです。
他にもやり方はあるみたいですが、一旦この方法に僕は落ち着いたので、この方法を紹介してみました。
コードは、公式ドキュメント見ながら理解に挑戦してみて下さい。
最後に
ということで、本記事はUILabelを長押し・タップでコピーする方法を自分のメモ程度にまとめました。
本記事を書いている僕自身は、まだSwift初学者のためコードに至らない点が多いと思います。参考程度にご活用下さい。
アドバイスやコードの改善などあれば本記事の最後の部分からコメントしてくださいね。
最後まで読んでいただきありがとうございました!
参考
>Appleドキュメント UIMenueController
>UILabelの文字を長押しでコピーする
>[iOS13]UILabelを長押ししてコピーしたい
おすすめSwift書籍
Swiftを学ぶなら、間違いのない2冊はこちら
リンク
リンク
Xcodeを学ぶなら下の一冊
リンク