iOS의 드래그 앤 드롭(한 걸음 앞의 드롭편)

9494 단어 iOSdrag&dropios11iPad
한 걸음 앞의 드래그편 」와 같이, 드롭에 관해서도 기본편으로 소개한 이상의 세세한 제어를 행할 수 있습니다.

여기에서는 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


  • iOS 드래그 앤 드롭(기본편)
  • iOS 드래그 앤 드롭(한 걸음 앞의 드래그편)
  • 좋은 웹페이지 즐겨찾기