iOS의 드래그 앤 드롭(한 걸음 앞의 드롭편)
여기에서는 UIDropInteractionDelegate에 정의된 몇 가지 다른 메소드에 대해 이것을 구현하여 무엇을 할 수 있는지, 어떻게 구현하는지 설명합니다.
드롭할 수 없는 것을 빨리 연주
「 기본편 」에서는 dropInteraction(_:sessionDidUpdate:) 로 드롭의 가부를 판단하고 있었습니다만, 이 메소드는 드러그 위치가 바뀔 때마다 불립니다.
그러나, 원래 드래그 중인 아이템에 취급할 수 있는 데이터가 전혀 없는 경우, 위치가 바뀔 때마다 몇번이나 판정하는 것은 비효율이군요.
그래서
dropInteraction(_:canHandle:)
를 구현해 두면 좋을 것입니다.dropInteraction(_:canHandle:)
이 메소드는 건네받은 세션을 확인해, 드롭 할 수 있을지 어떨지의 Bool 치를 돌려줍니다.
여기서 false를 반환하면 dropInteraction(_:sessionDidUpdate:)은 더 이상 호출되지 않습니다.
구현 예
func dropInteraction(_ interaction: UIDropInteraction,
canHandle session: UIDropSession) -> Bool {
// 文字列を取り出せるものしかドロップできない
return session.canLoadObjects(ofClass: NSString.self)
}
드롭 시 미리보기 제어
드롭하면, 디폴트에서는 드래그중의 프리뷰가 그 자리에 흡입되어 가도록(듯이), 조금씩 작아지면서 서서히 사라지는 애니메이션이 행해집니다. 이 거동은
dropInteraction(_:previewForDropping:withDefault:)
를 구현하면 변경할 수 있습니다.before
after
dropInteraction(_:previewForDropping:withDefault:)
이 메소드의 구현 방법은, 「 한 걸음 앞의 드래그편
세 번째 인수에 전달되는 기본 미리보기를 그대로 반환하면 단순히 드롭 위치에서 잠시 머무르는 동작을합니다.
nil 을 돌려주면(자), 표준의 거동(그 자리에서 조금씩 작아지면서 서서히 사라진다)를 합니다.
여기에서 완전히 새로운 UITargetedDragPreview를 반환해도 좋고, 기본 미리보기
UIDragInteractionDelegate
아이템이 배치되는 경우, 그 배치되는 위치로 이동시키는 것도 좋을 것입니다.구현 예
이 예에서는, 드롭 대상의
dragInteraction(_:previewForCancelling:withDefault:
func dropInteraction(_ interaction: UIDropInteraction,
previewForDropping item: UIDragItem,
withDefault defaultPreview: UITargetedDragPreview) -> UITargetedDragPreview? {
let target = UIDragPreviewTarget(container: view,
center: droppableView.center,
transform: CGAffineTransform(scaleX: 0.2, y: 0.2))
return defaultPreview.retargetedPreview(with: target)
}
드롭시 함께 애니메이션
드롭시의 애니메이션에 맞추어 다른 UI 요소를 애니메이션 시키려면
retargetedPreview(with:)
메소드를 구현합니다. 이것은 드롭 애니메이션이 시작되기 직전에 호출됩니다.또, 드롭의 애니메이션이 끝난 후에
droppableView
가 불립니다. 이 시점에서 애니메이션 한 것을 되돌리거나 추가 처리를 할 수 있습니다.dropInteraction(_:item:willAnimateDropWith:)
드롭 애니메이션이 시작되기 직전에 호출됩니다.
두 번째 인수에 전달된 UIDragAnimating 객체를 사용하여 드롭할 때 함께 수행하는 애니메이션을 설정할 수 있습니다.
구현 예
이 예에서는
view
를 드롭 대상의 dropInteraction(_:item:willAnimateDropWith:)
의 중심으로 이동하면서 확대합니다.func dropInteraction(_ interaction: UIDropInteraction,
item: UIDragItem,
willAnimateDropWith animator: UIDragAnimating) {
animator.addAnimations {
let offsetX = self.droppableView.bounds.width / 2 - self.dropIcon.center.x
let offsetY = self.droppableView.bounds.height / 2 - self.dropIcon.center.y
self.dropIcon.transform = CGAffineTransform(translationX: offsetX, y: offsetY)
.scaledBy(x: 3, y: 3)
}
}
dropInteraction(_:concludeDrop:)
드롭 애니메이션이 끝나면 호출됩니다.
구현 예
dropInteraction(_:concludeDrop:)
를 원래 위치로 되돌리고 있습니다.func dropInteraction(_ interaction: UIDropInteraction,
concludeDrop session: UIDropSession) {
dropIcon.transform = CGAffineTransform.identity
}
See Also
Reference
이 문제에 관하여(iOS의 드래그 앤 드롭(한 걸음 앞의 드롭편)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hironytic/items/8dfbfabe1c71947ddb45텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)