https://developer.apple.com/documentation/uikit/drag_and_drop/making_a_view_into_a_drag_source
"Adopt drag interaction APIs to provide items for dragging."
드래그를 위한 아이템 제공을 위해 드래그 상호작용 API를 채택합니다.
뷰에 대해 드래그 상호작용 딜리게이트(UIDragInteractionDelegate
)를 구현함으로써 해당 뷰를 앱에서 드래그 소스 역할로 기능하게 할 수 있습니다.
Note
UITextView
,UITableView
,UICollectionView
클래스는 드래그 아이템 생성을 위한 그들 고유의 특화된 지원을 제공합니다. 해당 클래스 문서에 나와있습니다.
UIView
의 모든 인스턴스 혹은 서브클래스는 드래그 소스로써의 역할을 할 수 있습니다. 그렇게 하려면 아래 단계를 수행해야 합니다.
UIDragInteraction
)을 생성합니다.UIDragInteractionDelegate
프로토콜을 따르는 객체)를 구체화합니다.커스텀 헬퍼 메소드를 사용하는 방법이 아래에 있습니다. 보통 뷰 컨트롤러의 viewDidLoad()
메소드 내부에 구현하게 될 것입니다.
func customEnableDragging(on view: UIView, dragInteractionDelegate: UIDragInteractionDelegate) {
let dragInteraction = UIDragInteraction(delegate: dragInteractionDelegate)
view.addInteraction(dragInteraction)
}
드래그 아이템은 한 모델 객체에 대한 다양한 데이터 표현을 제공하기 위해 소스 앱의 규약을 캡슐화합니다.
드래그 아이템을 생성하려면 드래그 상호작용 딜리게이트에서 dragInteraction(_:itemsForBeginning:)
메소들르 구현해야 합니다. 아래가 최소한의 형태입니다.
func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
// Cast to NSString is required for NSItemProviderWriting support.
let stringItemProvider = NSItemProvider(object: "Hello World" as NSString)
return [
UIDragItem(itemProvider: stringItemProvider)
]
}
Note
코드 스니펫에서 보이는, 스위프트 스트링 타입을Foundation
NSString
클래스로 캐스트하는 것이 요구됩니다. 왜냐하면 드래그 앤 드롭을 위한 모델 객체는NSItemProviderWriting
프로토콜을 지원해야 하기 때문입니다.
이 구현은 init(object:)
편의 이니셜라이저를 사용합니다. 드래그 아이템을 인스턴스화 하는 경우 앱의 네이티브 표현에 객체를 전달하거나 지원하는 highest-fidelity 표현에 전달해야 합니다. 아이템 프로바이더의 registeredTypeIdentifiers
배열에서 첫 번째 요소를 드래그 상호작용 딜리게이트가 전달할 수 있는 highest-fidelity 데이터로 하시기 바랍니다.
드래그 아이템에 더 많은 데이터 표현을 추가하고자 한다면, 이들에게 가장 높은 것부터 낮은 순으로 fidelity 순서를 추가하시기 바랍니다. 표현을 추가할 때, 아래에 나와있는 것을 선택할 수 있습니다.
NSItemProviderWriting
프로토콜을 채택하는 것입니다. 이 프로토콜을 사용해서 모델 클래스에 여러 데이터 표현을 제공하기 위한 코드를 작성할 수 있습니다.NSItemProvider
클래스로부터 registerObject(_:visibility:)
메소드 혹은 관련 메소드를 사용할 수 있습니다.dragInteraction(_:itemsForBeginning:)
프로토콜 메소드에서 소스앱은 시스템으로부터 요청에 반응합니다. 이 요청은 앱의 UI에서 아이템 드래그를 시작하는 사용자에 의해 촉발됩니다. 앱과 시스템 사이의 대화는 아래 그림처럼 진행됩니다.
그림읃 드래그 아이템을 구성하기 위한 단계들을 나타내고 있습니다.
UIDragSession
프로토콜을 따르는 객체)을 인스턴스화 합니다.dragInteraction(_:itemsForBeginning:)
프로토콜 메소드를 호출합니다. 딜리게이트는 하나 혹은 하나 이상의 드래그 아이템을 반환합니다.소스 앱과 대상 앱 사이에서 데이터 표현 규약을 전달하기 위해 드래그 아이템을 사용합니다.
https://developer.apple.com/documentation/uikit/drag_and_drop/understanding_a_drag_item_as_a_promise
https://velog.io/@panther222128/Understanding-a-Drag-Item-as-a-Promise
드래그된 컨텐트를 선택적으로 소비하기 위해 드롭 상호작용 API를 채택합니다.
https://developer.apple.com/documentation/uikit/drag_and_drop/making_a_view_into_a_drop_destination
https://velog.io/@panther222128/Making-a-View-into-a-Drop-Destination