2
2

More than 1 year has passed since last update.

UIEditMenuInteractionを使ってメニューを出してみた

Posted at

そもそもメニューってなんのこと?

今回はiOSの話に限りますが、テキストなどの文字列を長押ししたり
タップすると、画像のようにコピーや貼り付けできるメニューが表示されます。

ダウンロード.png

iOS16で今まで記載していたメニュー表記のライブラリが非推奨に・・・

現在まではメニュー表示やこのメニュー欄をカスタマイズする方法は、
「UIMenuController」を使用していました。

しかしiOS16ではこのライブラリが非推奨となり、
新たに「UIEditMenuInteraction」を使用することが
推奨されています。

今回はSwiftでメニューを試しに表示する方法を
簡単に説明しようかと思います!

早速コードを書いてみよう!

①まずは適当なUIを用意!

ここではコピーしたい任意の文字列を置きます。
Classは「UIEditMenuInteraction」を記載したいとこに書いておきました。
ex:CopyUILabel
スクリーンショット 2022-09-11 17.54.05.png

②指定したクラスでコードを記載

コードを記載していきます。
詳細はコメントをご覧いただけたらと思います。

長押し・タップ時の処理を呼び出し

// さっき指定したクラス
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とか触ってみたいな。。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2