2020年5月31日日曜日

iPhoneアプリのiPad対応3 - Drag and Drop

iPad対応 第3回目は、Drag and Drop。
SplitViewで、複数のアプリを同時に表示するメリットの一つが、他アプリのデータをDrag and Dropでコピーできること。

UITextField, UITextAreaは、デフォルトでテキストのDnDに対応している様子。
今回対応中のレシピアプリでは、画像が登録できる機能があるので、他アプリから画像をDropで追加できるようにしてみた。



Web上の画像をアプリに登録する場合は、かなり楽になる!
Drag and Dropの仕組みは、iOS 11以上のUITableView, UICollectionView で実装が可能。

Dropの実装

使用するのは、UITableViewDropDelegate

canHandleのメソッドで、受け取り可能なClassかをチェックする。今回はUIImageのみ可能に。

Dropの処理は、以下のように実装した。
UITableViewDropPlaceholder で一時的なViewを作り、処理が完了したら削除する。

Dragの実装

Dragを実装すると、外部アプリへデータをドラッグできるようになる。使用するのはUITableViewDragDelegate
itemsForBeginning で、受け渡したい情報を設定する。

DragDelegateとともに、tableView(_:canMoveRowAt:)tableView(_:moveRowAt:to:) などを実装すると、テーブル内のセルの順番をDnDで操作することも可能になる。
以下は、同じSection内に限りDnDで行を入れ替えることができる実装例。


外部アプリにデータを渡さないのであれば、itemsForBeginningの戻り値は設定なしでOK。

ただし、tableView(_:moveRowAt:to:) の処理中で、tableView.reloadSections で更新すると、次回から行移動ができなくなるバグ?があるみたいなので注意。tableView.reloadData() だと大丈夫のようだ。

iPadだと、登録がかなり楽になる! 素敵!
次回につづく。
• • •