Xamarin.iOS에서 끌어서 놓기Drag and Drop in Xamarin.iOS

끌어서 놓기 ios 11의 구현Implementing drag and drop for iOS 11

iOS 11 포함 끌어서 놓기 지원을 iPad에서 응용 프로그램 간에 데이터를 복사 합니다.iOS 11 includes drag and drop support to copy data between applications on the iPad. 사용자가 선택 하 고 배치 앱-side-by-side, 또는 데이터를 삭제할 수 있도록 하 여 앱을 트리거할 앱 아이콘 위로 드래그 하 여 모든 유형의 콘텐츠를 끌어 수 있습니다.Users can select and drag all types of content from apps positioned side-by-side, or by dragging over an app icon which will trigger the app to open and to allow the data to be dropped:

메모 앱에 사용자 지정 앱에서 끌어서 놓기 예제

참고

끌어서 놓기는 iPhone에서 동일한 앱 내에서 사용할 수만 있습니다.Drag and drop is only available within the same app on iPhone.

끌어서 지원 고려 하 고 어디서 나 콘텐츠 놓기 작업은 만들거나 편집할 수 있습니다.Consider supporting drag and drop operations anywhere content can be created or edited:

  • 텍스트 컨트롤 추가 작업 없이 iOS 11에 대해 빌드된 모든 앱에 대 한 끌어서 놓기 지원 합니다.Text controls support drag and drop for all apps built against iOS 11, without any additional work.
  • 테이블 뷰와 컬렉션 뷰 간소화 추가 끌어서 놓기 동작을 iOS 11의에서 향상 된 기능을 포함 합니다.Table views and collection views include enhancements in iOS 11 that simplify adding drag and drop behavior.
  • 끌어서 지원 추가 사용자 지정을 사용 하 여 삭제를 다른 뷰를 만들 수 있습니다.Any other view can be made to support drag and drop with additional customization.

앱에 추가 하는 끌어서 놓기 지원, 경우에 서로 다른 수준의 콘텐츠 충실도;을 제공할 수 있습니다. 예를 들어 수신 앱을 끌기 대상으로 가장 적합 한는 선택할 수 있도록 서식 있는 텍스트 및 데이터의 일반 텍스트 버전을 모두 제공할 수 있습니다.When adding drag and drop support to your apps, you can provide different levels of content fidelity; for example, you might provide both a formatted text and plain text version of the data so that the receiving app can choose which fits best into the drag target. 끌어서 시각화를 사용자 지정할 수 있으며 한 번에 여러 항목을 끌어 올 수 있도록 이기도 합니다.It is also possible to customize the drag visualization, and also to enable dragging multiple items at once.

텍스트 컨트롤을 사용한 끌어서 놓기Drag and Drop with text controls

UITextViewUITextField 자동으로, 선택한 텍스트를 놓는 텍스트 콘텐츠를 지원 합니다.UITextView and UITextField automatically support dragging selected text out, and dropping text content in.

UITableView 사용한 끌어서 놓기Drag and Drop with UITableView

UITableView 끌어서 놓기 테이블 행을 기본 동작을 사용 하도록 설정 하려면 몇 가지 방법만 요구와 상호 작용에 대 한 기본 제공 처리를 있습니다.UITableView has built-in handling for drag and drop interactions with table rows, requiring only a few methods to enable the default behavior.

두 개의 인터페이스가 포함 됩니다.There are two interfaces involved:

  • IUITableViewDragDelegate – 테이블 보기의 끌기 시작할 때 패키지 정보입니다.IUITableViewDragDelegate – Packages information when a drag is initiated in the table view.
  • IUITableViewDropDelegate – 저장 될 때 정보를 처리 하려고 하 고 완료 합니다.IUITableViewDropDelegate – Processes information when a drop is being attempted and completed.

DragAndDropTableView 샘플 두 인터페이스 모두에서 구현 됩니다는 UITableViewController 클래스, 대리자 및 데이터 원본입니다.In the DragAndDropTableView sample these two interfaces are both implemented on the UITableViewController class, along with the delegate and data source. 에 할당 된 ViewDidLoad 메서드:They're assigned in the ViewDidLoad method:

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

이러한 두 인터페이스에 대 한 최소한의 필요한 코드를 아래 설명 되어 있습니다.The minimal required code for these two interfaces is explained below.

테이블 보기 끌어서 대리자Table View Drag Delegate

유일한 방법은 필요 표 보기에서 행을 끌어 지원 하기 위해 GetItemsForBeginningDragSession합니다.The only method required to support dragging a row from a table view is GetItemsForBeginningDragSession. 사용자가 행을 끌기 시작 되 면이 메서드를 호출 합니다.If the user starts to drag a row, this method will be called.

구현은 다음과 같습니다.An implementation is shown below. 끌어 온된 행과 연결 된 데이터를 검색, 인코드, 하 고 구성를 NSItemProvider 응용 프로그램 작업의 "drop" 부분을 처리 하는 방법을 결정 하는 (예를 들어 여부 처리할 수 있도록 데이터 형식, PlainText, 예제에서):It retrieves the data associated with the dragged row, encodes it, and configures an NSItemProvider which determines how applications will handle the "drop" part of the operation (for example, whether they can handle the data type, PlainText, in the example):

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

대상 앱에서 활용 수행할 수 있는 여러 데이터 표현을 제공 하는 등의 끌기 동작을 사용자 지정할 구현할 수 있는 끌어서 대리자에 다양 한 선택적 메서드 (서식 있는 텍스트는 일반 텍스트 또는 벡터와 같은 및 비트맵의 버전은 그리기)입니다.There are many optional methods on the drag delegate that can be implemented to customize the drag behavior, such as providing multiple data representations which can be taken advantage of in target apps (such as formatted text as well as plain text, or a vector and bitmap versions of a drawing). 동일한 앱 내에서 끌어서 놓아 때 사용 되는 사용자 지정 데이터 표현을 제공할 수도 있습니다.You can also provide custom data representations to be used when dragging and dropping within the same app.

테이블 보기 놓기 대리자Table View Drop Delegate

Drop 대리자에서 메서드는 끌기 작업 테이블 뷰를 통해 수행 되거나 이보다 완료 될 때 호출 됩니다.The methods on the drop delegate are called when a drag operation occurs over a table view, or completes above it. 필요한 방법 드롭다운 완료 되 면 수행 되는 작업 및 데이터를 삭제 하도록 허용 되는지 여부를 결정 합니다.The required methods determine whether the data is allowed to be dropped, and what actions are taken if the drop is completed:

  • CanHandleDropSession – 끌기 in progress, 그리고 잠재적으로 응용 프로그램 삭제 중 상태인 동안이 메서드는 끌고 있는 데이터는 삭제할 수 있는지 여부를 결정 합니다.CanHandleDropSession – While a drag is in progress, and potentially being dropped on the application, this method determines whether the data being dragged is allowed to be dropped.
  • DropSessionDidUpdate – 끌기 중에서 상태인 동안 작업 것을 확인 하려면이 메서드 호출 됩니다.DropSessionDidUpdate – While the drag is in progress, this method is called to determine what action is intended. 위로 끌고 테이블 보기, 끌어서 세션 및 가능한 인덱스 경로 정보를 사용할 수 있습니다 모든 동작 및 사용자에 게 제공 하는 시각적 피드백을 확인 하려면.Information from the table view being dragged over, the drag session, and the possible index path can all be used to determine the behavior and visual feedback provided to the user.
  • PerformDrop – 끝나면 사용자 드롭다운 (해당 손가락 들어올려),이 메서드는 끌고 있는 데이터를 추출 하 고 새 행 또는 (행)의 데이터를 추가 하려면 테이블 뷰를 수정 합니다.PerformDrop – When the user completes the drop (by lifting their finger), this method extracts the data being dragged and modifies the table view to add the data in a new row (or rows).

CanHandleDropSessionCanHandleDropSession

CanHandleDropSession 테이블 보기 끌고 있는 데이터를 사용할 수 있는지 여부를 나타냅니다.CanHandleDropSession indicates whether the table view can accept the data being dragged. 이 코드 조각에서는 CanLoadObjects 이 테이블 뷰의 문자열 데이터를 사용할 수 있는 확인 하는 데 사용 됩니다.In this code snippet, CanLoadObjects is used to confirm that this table view can accept string data.

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

DropSessionDidUpdateDropSessionDidUpdate

DropSessionDidUpdate 메서드는 끌기 작업 진행 중, 사용자에 게 시각 신호를 제공 하는 동안 반복적으로 호출 됩니다.The DropSessionDidUpdate method is called repeatedly while the drag operation is in progress, to provide visual cues to the user.

아래 코드에서 HasActiveDrag 현재 테이블 보기의 작업을 시작 하는지 여부를 결정 하는 데 사용 됩니다.In the code below, HasActiveDrag is used to determine whether the operation originated in the current table view. 그렇다면 단일 행만 이동할 수 있습니다.If so, only single rows are allowed to be moved. 다른 소스에서 끌기 인 경우 복사 작업을 표시 됩니다.If the drag is from another source, a copy operation will be indicated:

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

Drop 작업 중 하나일 수 있습니다 Cancel하십시오 Move, 또는 Copy합니다.The drop operation can be one of Cancel, Move, or Copy.

Drop 의도 새 행을 삽입 하거나 기존 행에 데이터 추가/추가 될 수 있습니다.The drop intent can be to insert a new row, or add/append data to an existing row.

PerformDropPerformDrop

PerformDrop 메서드는 사용자 작업을 완료 하 고 끌어 놓은 데이터를 반영 하도록 테이블 뷰 및 데이터 소스를 수정 합니다.The PerformDrop method is called when the user completes the operation, and modifies the table view and data source to reflect the dropped data.

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

큰 데이터 개체를 비동기적으로 로드 하려면 추가 코드를 추가할 수 있습니다.Additional code can be added to asynchronously load large data objects.

테스트 끌어서 놓기Testing Drag and Drop

IPad를 사용 하 여 테스트 해야 합니다 샘플합니다.You must use an iPad to test the sample. 다른 앱 (예: 정보)와 함께 샘플을 열고 서로 행 및 텍스트를 끕니다.Open the sample alongside another app (such as Notes) and drag rows and text between them:

끌기 작업 중에서의 스크린샷