iPad&iPhoneでDrag&Dropして画像取得する _φ(・_・m

こんにちは、川上です。
久々のブログ書きです。
 散らかした周りのネタ記事を、少しは、お片付けしようかなぁ・・・てことで。
おうちで用のMyOnlyアプリを、のんびりと作っていくと、段々と形になりました。
 せさほどの無い諸々のMy作成メモをアレコレと書いています。
 (オチがなかったら、すみません )
iPhone/iPadでウィジェットを貼り付けて、ウィジェットの画像がチョコチョコと変わってくれるMyOnlyアプリ(「hogehoge・ピンガー(仮)」アプリ)を作ってみました。
「hogehoge・ピンガー」アプリの内容は、
 ・「写真」アプリから画像取得して、
 ・Realmで保存して、
 ・ウィジェットでRealmで読み込んで
 ・ウィジェット内画像を数分毎に、変わる。
 までは、追々で、できました。
 これはこれで、いいじゃんと、結構の自己満足でした。

その後、
 iPadではSpritView形態で動かせるると、アプリ間をDrag&Dropで画像を転送取得できるらしいこと。
 で、つい、モクモクが。。
 巷から、検索して調べて研究しました。
「hogehoge・ピンガー」アプリの開発環境のベースは、
 ・SwiftUI + RealmSwift
 ・iOS,iPadOS ver15
 です。
ドラッグ&ドロップ処理のキーポイントは、
 ・.onDrag()・・・ 画像を移動させる
 ・.onDrop()・・・ 画像を受ける
 ・DropDelegate / dragDelegate ・・・ デリゲート 
 でした。
他アプリの画像から、「hogehoge・ピンガー」アプリへ転送させるだけなので、
 ・.onDrop()・・・ 画像を受ける
 ・DropDelegate ・・・ デリゲート 
 を、塩梅に使えれば、期待の動作が出来そうでした。
 
で、.onDrop()、DropDelegateの概要はこんな感じです。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | // 写真の取り込み方法 struct ImageDropDelegate: DropDelegate {     @Binding var dropedImage: UIImage?     // === performDrop() ===     func performDrop(info: DropInfo) -> Bool {         guard info.hasItemsConforming(to: ["public.image","public.png","public.jpeg"])         else {             print("-- drop error --")             return false         }          let itemProviderss = info.itemProviders(for: ["public.image","public.png","public.jpeg"])         for itemProvider in itemProviderss {             itemProvider.loadObject(ofClass: UIImage.self) { imageMaybe, errorMaybe in                 if let image = imageMaybe as? UIImage {                   DispatchQueue.main.async {                       // do something with the image                       self.dropedImage = image                   }                  }                  else {                     // === Drop error msg on                     print("-- drop error --")                 }             }          }          return true     }  }  //=== struct ContentView: View {  @State private var image: UIImage?        var body: some View {         ZStack {             if let uiImage = image {                 Image(uiImage: uiImage)                     .resizable()                     .scaledToFit()                     //  === Image Drop                     .onDrop(of: ["public.image","public.png","public.jpeg"],                             delegate: ImageDropDelegate(dropedImage:$image ))             }              else {                    Image(uiImage:UIImage(named: "app_icon1024.png")!)                   .resizable()                   .scaledToFit()                     // === Image Drop                   .onDrop(of: ["public.image","public.png","public.jpeg"],                             delegate: ImageDropDelegate(dropedImage:$image ))                           }                   }          } } | 
このベースコードに、アレコレに何たらしていって、塩梅な動作になりました。
ちなみに、iOS15は、iPhoneでも2つの指を使えれば、Drag&Dropできるyo
ではでは。

