そもそもメニューってなんのこと?
今回はiOSの話に限りますが、テキストなどの文字列を長押ししたり
タップすると、画像のようにコピーや貼り付けできるメニューが表示されます。
iOS16で今まで記載していたメニュー表記のライブラリが非推奨に・・・
現在まではメニュー表示やこのメニュー欄をカスタマイズする方法は、
「UIMenuController」を使用していました。
しかしiOS16ではこのライブラリが非推奨となり、
新たに「UIEditMenuInteraction」を使用することが
推奨されています。
今回はSwiftでメニューを試しに表示する方法を
簡単に説明しようかと思います!
早速コードを書いてみよう!
①まずは適当なUIを用意!
ここではコピーしたい任意の文字列を置きます。
Classは「UIEditMenuInteraction」を記載したいとこに書いておきました。
ex:CopyUILabel
②指定したクラスでコードを記載
コードを記載していきます。
詳細はコメントをご覧いただけたらと思います。
長押し・タップ時の処理を呼び出し
// さっき指定したクラス
class CopyUILabel: UILabel {
// タップまたは長押しした時の処理をする制御関数
func copyInit() {
// タップ有効
self.isUserInteractionEnabled = true
// 長押しでもタップでも好きな方を選択して、使用
// 長押しコピー
//self.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(CopyUILabel.showMenu(sender:))))
// 軽くタッチコピー
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(CopyUILabel.showMenu(_:))))
}
}
上記で呼び出し後、実際にメニューを表示
@objc func showMenu(_ recognizer: UIGestureRecognizer) {
self.becomeFirstResponder()
if #available(iOS 16.0, *) {
// iOS16以降は「UIEditMenuInteraction」を使用する
let editMenuInteraction = UIEditMenuInteraction(delegate: self)
// 画面の大まかな場所を決める
let location = recognizer.location(in: self.view) // locationの引数は任意のViewを入れる
let configuration = UIEditMenuConfiguration(identifier: nil, sourcePoint: location)
// メニュー表示する
editMenuInteraction.presentEditMenu(with: configuration)
} else {
// iOS15以下の場合
// オマケで「UIMenuController」でも書いてみた
let contextMenu = UIMenuController.shared
if !contextMenu.isMenuVisible {
contextMenu.showMenu(from: self, rect: self.bounds)
}
}
}
availableで「iOS16以上」を指定する場合、
実機テスト用端末に注意!
③最後にメニューを表示するためのオプションとテキストコピー!
// テキストをコピーする
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)
}
最後に
これでメニューを無事記載することはできましたでしょうか?
注意事項として、iOS16から使用されるライブラリは
xcode14以上を使用しないと警告が出る場合があります!
この記事が皆様のお役に立てたら
幸いです。
今度はTypeScriptとか触ってみたいな。。