Aracılığıyla paylaş


Xamarin.iOS'ta Sürükleyip Bırakma

iOS 11 için sürükle ve bırak uygulama

iOS 11, iPad'de uygulamalar arasında veri kopyalamaya yönelik sürükle ve bırak desteği içerir. Kullanıcılar yan yana konumlandırılan uygulamalardan tüm içerik türlerini seçip sürükleyebilir veya uygulamanın açılmasını tetikleyen ve verilerin bırakılmasına izin veren bir uygulama simgesinin üzerine sürükleyebilir:

Özel uygulamadan Notlar uygulamasına örnek sürükleyip bırakma

Not

iOS 15'in öncesinde sürükle ve bırak özelliği yalnızca i Telefon üzerinde aynı uygulama içinde kullanılabilir. iOS 15, uygulamalar arası sürükle ve bırak'ı tanıtır.

İçeriğin oluşturulabileceği veya düzenlenebileceği her yerde sürükle ve bırak işlemlerini desteklemeyi göz önünde bulundurun:

  • Metin denetimleri, iOS 11'de oluşturulan tüm uygulamalar için ek bir çalışma olmadan sürükleyip bırakmayı destekler.
  • Tablo görünümleri ve koleksiyon görünümleri, iOS 11'de sürükle ve bırak davranışı eklemeyi basitleştiren iyileştirmeler içerir.
  • Başka herhangi bir görünüm, ek özelleştirme ile sürükleyip bırakmayı desteklemek için yapılabilir.

Uygulamalarınıza sürükle ve bırak desteği eklerken farklı içerik uygunluk düzeyleri sağlayabilirsiniz; örneğin, alıcı uygulamanın sürükleme hedefine en uygun olanı seçebilmesi için hem biçimlendirilmiş bir metin hem de verilerin düz metin sürümünü sağlayabilirsiniz. Sürükleme görselleştirmesini özelleştirmek ve aynı anda birden çok öğe sürüklemeyi etkinleştirmek de mümkündür.

Metin denetimleriyle sürükleyip bırakma

UITextView ve UITextField otomatik olarak seçili metni dışarı sürüklemeyi ve metin içeriğini bırakmayı destekler.

UITableView ile Sürükleyip Bırakma

UITableView , tablo satırlarıyla sürükle ve bırak etkileşimleri için yerleşik işlemeye sahiptir ve varsayılan davranışı etkinleştirmek için yalnızca birkaç yöntem gerekir.

İki arabirim vardır:

  • IUITableViewDragDelegate – Tablo görünümünde sürükleme başlatıldığında bilgileri paketler.
  • IUITableViewDropDelegate – Bırakma girişiminde bulunup tamamlandığında bilgileri işler.

Örnekte bu iki arabirim, temsilci ve veri kaynağıyla birlikte sınıfında uygulanır UITableViewController . Bunlar yönteminde ViewDidLoad atanır:

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

Bu iki arabirim için gereken en düşük kod aşağıda açıklanmıştır.

Tablo Görünümü Sürükleme Temsilcisi

Tablo görünümünden satır sürüklemeyi desteklemek için gereken tek yöntemdir.GetItemsForBeginningDragSession Kullanıcı bir satırı sürüklemeye başlarsa, bu yöntem çağrılır.

Aşağıda bir uygulama gösterilmiştir. Sürüklenen satırla ilişkili verileri alır, kodlar ve uygulamaların işlemin "bırakma" bölümünü (örneğin, veri türünü PlainTextişleyip işleyemeyeceğini) belirleyen bir NSItemProvider yapılandırılır:

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) };
}

Sürükleme temsilcisinde, hedef uygulamalarda (biçimlendirilmiş metin ve düz metin ya da çizimin vektör ve bit eşlem sürümleri gibi) yararlanabilecek birden çok veri gösterimi sağlama gibi, sürükleme davranışını özelleştirmek için uygulanabilen birçok isteğe bağlı yöntem vardır. Aynı uygulama içinde sürüklenip bırakıldığında kullanılacak özel veri gösterimleri de sağlayabilirsiniz.

Tablo Görünümü Bırakma Temsilcisi

Bırakma temsilcisindeki yöntemler, bir tablo görünümü üzerinde bir sürükleme işlemi gerçekleştiğinde veya bunun üzerinde tamamlandığında çağrılır. Gerekli yöntemler, verilerin bırakılmasına izin verilip verilmeyeceğini ve bırakma işlemi tamamlandığında hangi eylemlerin gerçekleştirileceğini belirler:

  • CanHandleDropSession – Sürüklenme işlemi devam ederken ve büyük olasılıkla uygulamaya bırakılıyor olsa da, bu yöntem sürüklenen verilerin bırakılmasına izin verilip verilmediğini belirler.
  • DropSessionDidUpdate – Sürükleme işlemi devam ederken, hangi eylemin hedefleneceğini belirlemek için bu yöntem çağrılır. Sürüklenen tablo görünümünden, sürükleme oturumundan ve olası dizin yolundan alınan bilgilerin tümü, kullanıcıya sağlanan davranışı ve görsel geri bildirimleri belirlemek için kullanılabilir.
  • PerformDrop – Kullanıcı bırakma işlemini tamamladığında (parmağını kaldırarak), bu yöntem sürüklenen verileri ayıklar ve tablo görünümünü değiştirerek verileri yeni bir satıra (veya satıra) ekler.

CanHandleDropSession

CanHandleDropSession tablo görünümünün sürüklenen verileri kabul edip etmediğini gösterir. Bu kod parçacığında, CanLoadObjects bu tablo görünümünün dize verilerini kabul edebildiğini onaylamak için kullanılır.

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

DropSessionDidUpdate

Kullanıcıya DropSessionDidUpdate görsel ipuçları sağlamak için sürükleme işlemi devam ederken yöntemi art arda çağrılır.

Aşağıdaki kodda, HasActiveDrag işlemin geçerli tablo görünümünden kaynaklanıp kaynaklandığını belirlemek için kullanılır. Öyleyse, yalnızca tek satırların taşınmasına izin verilir. Sürükleme başka bir kaynaktan geliyorsa kopyalama işlemi gösterilir:

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);
  }
}

Bırakma işlemi , Moveveya Copyişlemlerinden biri Cancelolabilir.

Bırakma amacı yeni bir satır eklemek veya var olan bir satıra veri eklemek/eklemek olabilir.

PerformDrop

yöntemi PerformDrop , kullanıcı işlemi tamamladığında çağrılır ve tablo görünümünü ve veri kaynağını bırakılan verileri yansıtacak şekilde değiştirir.

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);
  });
}

Büyük veri nesnelerini zaman uyumsuz olarak yüklemek için ek kod eklenebilir.