Bagikan melalui


Seret dan Letakkan di Xamarin.iOS

Menerapkan seret dan letakkan untuk iOS 11

iOS 11 menyertakan dukungan seret dan lepas untuk menyalin data antar aplikasi di iPad. Pengguna dapat memilih dan menyeret semua jenis konten dari aplikasi yang diposisikan berdampingan, atau dengan menyeret ikon aplikasi yang akan memicu aplikasi untuk membuka dan memungkinkan data dihilangkan:

Seret dan letakkan contoh dari aplikasi kustom ke aplikasi Notes

Catatan

Sebelum iOS 15, seret dan letakkan hanya tersedia dalam aplikasi yang sama di i Telepon. iOS 15 memperkenalkan seret dan letakkan lintas aplikasi.

Pertimbangkan untuk mendukung operasi seret dan letakkan di mana saja konten dapat dibuat atau diedit:

  • Kontrol teks mendukung seret dan letakkan untuk semua aplikasi yang dibangun terhadap iOS 11, tanpa pekerjaan tambahan apa pun.
  • Tampilan tabel dan tampilan koleksi menyertakan penyempurnaan di iOS 11 yang menyederhanakan penambahan perilaku seret dan letakkan.
  • Tampilan lain dapat dibuat untuk mendukung seret dan letakkan dengan kustomisasi tambahan.

Saat menambahkan dukungan seret dan lepas ke aplikasi, Anda dapat memberikan tingkat keakuratan konten yang berbeda; misalnya, Anda dapat memberikan versi teks yang diformat dan teks biasa dari data sehingga aplikasi penerima dapat memilih mana yang paling sesuai dengan target seret. Dimungkinkan juga untuk menyesuaikan visualisasi seret, dan juga untuk mengaktifkan penyeretan beberapa item sekaligus.

Seret dan Letakkan dengan kontrol teks

UITextView dan UITextField secara otomatis mendukung penyeretan teks yang dipilih, dan menjatuhkan konten teks.

Seret dan Letakkan dengan UITableView

UITableView memiliki penanganan bawaan untuk interaksi seret dan letakkan dengan baris tabel, hanya memerlukan beberapa metode untuk mengaktifkan perilaku default.

Ada dua antarmuka yang terlibat:

  • IUITableViewDragDelegate – Informasi paket saat seret dimulai dalam tampilan tabel.
  • IUITableViewDropDelegate – Memproses informasi saat penghilangan sedang dicoba dan diselesaikan.

Dalam sampel kedua antarmuka ini keduanya diimplementasikan pada UITableViewController kelas , bersama dengan delegasi dan sumber data. Mereka ditetapkan dalam ViewDidLoad metode :

this.TableView.DragDelegate = this;
this.TableView.DropDelegate = this;

Kode minimal yang diperlukan untuk kedua antarmuka ini dijelaskan di bawah ini.

Delegasi Seret Tampilan Tabel

Satu-satunya metode yang diperlukan untuk mendukung penyeretan baris dari tampilan tabel adalah GetItemsForBeginningDragSession. Jika pengguna mulai menyeret baris, metode ini akan dipanggil.

Implementasi ditunjukkan di bawah ini. Ini mengambil data yang terkait dengan baris yang diseret, mengodekannya, dan mengonfigurasi NSItemProvider yang menentukan bagaimana aplikasi akan menangani bagian "drop" dari operasi (misalnya, apakah mereka dapat menangani jenis data, PlainText, dalam contoh):

public UIDragItem[] GetItemsForBeginningDragSession (UITableView tableView,
  IUIDragSession session, NSIndexPath indexPath)
{
  // gets the 'information' to be dragged
  var placeName = model.PlaceNames[indexPath.Row];
  // convert to NSData representation
  var data = NSData.FromString(placeName, NSStringEncoding.UTF8);
  // create an NSItemProvider to describe the data
  var itemProvider = new NSItemProvider();
  itemProvider.RegisterDataRepresentation(UTType.PlainText,
                                NSItemProviderRepresentationVisibility.All,
                                (completion) =>
  {
    completion(data, null);
    return null;
  });
  // wrap in a UIDragItem
  return new UIDragItem[] { new UIDragItem(itemProvider) };
}

Ada banyak metode opsional pada delegasi seret yang dapat diimplementasikan untuk menyesuaikan perilaku seret, seperti menyediakan beberapa representasi data yang dapat dimanfaatkan dalam aplikasi target (seperti teks yang diformat serta teks biasa, atau versi vektor dan bitmap gambar). Anda juga dapat menyediakan representasi data kustom yang akan digunakan saat menyeret dan menghilangkan dalam aplikasi yang sama.

Delegasi Penurunan Tampilan Tabel

Metode pada delegasi drop dipanggil ketika operasi seret terjadi di atas tampilan tabel, atau selesai di atasnya. Metode yang diperlukan menentukan apakah data diizinkan untuk dihilangkan, dan tindakan apa yang diambil jika penghilangan selesai:

  • CanHandleDropSession – Saat seret sedang berlangsung, dan berpotensi dihilangkan pada aplikasi, metode ini menentukan apakah data yang diseret diizinkan untuk dihilangkan.
  • DropSessionDidUpdate – Saat seret sedang berlangsung, metode ini dipanggil untuk menentukan tindakan apa yang dimaksudkan. Informasi dari tampilan tabel yang diseret, sesi seret, dan jalur indeks yang mungkin semuanya dapat digunakan untuk menentukan perilaku dan umpan balik visual yang diberikan kepada pengguna.
  • PerformDrop – Ketika pengguna menyelesaikan penurunan (dengan mengangkat jari mereka), metode ini mengekstrak data yang diseret dan memodifikasi tampilan tabel untuk menambahkan data dalam baris baru (atau baris).

CanHandleDropSession

CanHandleDropSession menunjukkan apakah tampilan tabel dapat menerima data yang diseret. Dalam cuplikan kode ini, CanLoadObjects digunakan untuk mengonfirmasi bahwa tampilan tabel ini dapat menerima data string.

public bool CanHandleDropSession(UITableView tableView, IUIDropSession session)
{
  return session.CanLoadObjects(typeof(NSString));
}

DropSessionDidUpdate

Metode DropSessionDidUpdate ini dipanggil berulang kali saat operasi seret sedang berlangsung, untuk memberikan isjin visual kepada pengguna.

Dalam kode di bawah ini, HasActiveDrag digunakan untuk menentukan apakah operasi berasal dari tampilan tabel saat ini. Jika demikian, hanya satu baris yang diizinkan untuk dipindahkan. Jika seret berasal dari sumber lain, operasi salin akan ditunjukkan:

public UITableViewDropProposal DropSessionDidUpdate(UITableView tableView, IUIDropSession session, NSIndexPath destinationIndexPath)
{
  // The UIDropOperation.Move operation is available only for dragging within a single app.
  if (tableView.HasActiveDrag)
  {
    if (session.Items.Length > 1)
    {
        return new UITableViewDropProposal(UIDropOperation.Cancel);
    } else {
        return new UITableViewDropProposal(UIDropOperation.Move, UITableViewDropIntent.InsertAtDestinationIndexPath);
    }
  } else {
    return new UITableViewDropProposal(UIDropOperation.Copy, UITableViewDropIntent.InsertAtDestinationIndexPath);
  }
}

Operasi penghilangan bisa menjadi salah satu dari Cancel, Move, atau Copy.

Niat penurunan bisa untuk menyisipkan baris baru, atau menambahkan/menambahkan data ke baris yang sudah ada.

PerformDrop

Metode PerformDrop ini dipanggil ketika pengguna menyelesaikan operasi, dan memodifikasi tampilan tabel dan sumber data untuk mencerminkan data yang dihilangkan.

public void PerformDrop(UITableView tableView, IUITableViewDropCoordinator coordinator)
{
  NSIndexPath indexPath, destinationIndexPath;
  if (coordinator.DestinationIndexPath != null)
  {
    indexPath = coordinator.DestinationIndexPath;
    destinationIndexPath = indexPath;
  }
  else
  {
    // Get last index path of table view
    var section = tableView.NumberOfSections() - 1;
    var row = tableView.NumberOfRowsInSection(section);
    destinationIndexPath = NSIndexPath.FromRowSection(row, section);
  }
  coordinator.Session.LoadObjects(typeof(NSString), (items) =>
  {
    // Consume drag items
    List<string> stringItems = new List<string>();
    foreach (var i in items)
    {
      var q = NSString.FromHandle(i.Handle);
      stringItems.Add(q.ToString());
    }
    var indexPaths = new List<NSIndexPath>();
    for (var j = 0; j < stringItems.Count; j++)
    {
      var indexPath1 = NSIndexPath.FromRowSection(destinationIndexPath.Row + j, destinationIndexPath.Section);
      model.AddItem(stringItems[j], indexPath1.Row);
      indexPaths.Add(indexPath1);
    }
    tableView.InsertRows(indexPaths.ToArray(), UITableViewRowAnimation.Automatic);
  });
}

Kode tambahan dapat ditambahkan ke objek data besar yang dimuat secara asinkron.