[swift] TableFlip 애니메이션을 사용하여 Swift에서 테이블 뷰에서 셀을 드래그 앤 드롭 정렬하는 방법

테이블 뷰에서 셀을 드래그 앤 드롭하여 정렬하는 기능은 사용자 인터페이스를 개선하고 사용성을 향상시키는 좋은 방법입니다. 이를 위해 Swift에서 TableFlip 애니메이션을 사용하여 테이블 뷰 셀을 드래그 앤 드롭하여 정렬하는 방법을 알아보겠습니다.

TableFlip 애니메이션

TableFlip 애니메이션은 테이블 뷰 셀을 애니메이션으로 교환하는 기능을 제공하는 라이브러리입니다. 이를 사용하여 셀을 드래그 앤 드롭하여 위치를 변경할 수 있습니다.

먼저, TableFlip 애니메이션을 프로젝트에 추가해야 합니다. 이를 위해 CocoaPods을 사용하겠습니다. Podfile에 다음을 추가하고 pods install 명령을 실행하세요.

pod 'TableFlip'

이제 TableFlip을 프로젝트에 import하고 UITableViewDelegate를 채택하는 클래스에서 다음 코드를 추가합니다.

import TableFlip

class ViewController: UIViewController, UITableViewDelegate {

    // ...

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.selectionFeedbackGenerator.prepare()
    }

    func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
        guard let destinationIndexPath = coordinator.destinationIndexPath else { return }

        tableView.performBatchUpdates({
            for (index, item) in coordinator.items.enumerated() {

                let sourceIndexPath = item.sourceIndexPath
                let dragItem = item.dragItem

                tableView.deleteRows(at: [sourceIndexPath], with: .automatic)
                tableView.insertRows(at: [destinationIndexPath], with: .automatic)

                item.dragItem.localObject = item.dragItem.localObject
                item.dragItem.localObject = dragItem
            }
        })
    }
    
    // ...
}

정렬 가능한 테이블 뷰 설정

테이블 뷰에서 셀을 드래그 앤 드롭하여 정렬하려면 정렬 기능을 활성화해야 합니다. 이를 위해 다음 코드를 viewDidLoad 함수에 추가합니다.

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dragInteractionEnabled = true
    tableView.dragDelegate = self
    tableView.dropDelegate = self
}

또한, UITableViewDragDelegateUITableViewDropDelegate를 채택하는 클래스를 추가합니다.

extension ViewController: UITableViewDragDelegate {

    func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
        let item = tableView.dataSource?.tableView(tableView, cellForRowAt: indexPath)
        let itemProvider = NSItemProvider(object: item)
        let dragItem = UIDragItem(itemProvider: itemProvider)
        dragItem.localObject = item

        return [dragItem]
    }
}

extension ViewController: UITableViewDropDelegate {

    func tableView(_ tableView: UITableView, canHandle session: UIDropSession) -> Bool {
        return session.canLoadObjects(ofClass: String.self)
    }

    func tableView(_ tableView: UITableView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UITableViewDropProposal {
        return UITableViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
    }

    func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
        guard let destinationIndexPath = coordinator.destinationIndexPath else { return }

        // TableFlip 애니메이션 적용
        tableView.animateRowChanges(coordinator: coordinator, animation: .fade(duration: 0.5))

        tableView.reloadData()
    }
}

위의 코드에서 UITableViewDragDelegatetableView(_:itemsForBeginning:at) 함수에서 드래그 항목을 설정하고, UITableViewDropDelegatetableView(_:performDropWith:) 함수에서 드랍 동작 후 TableFlip 애니메이션을 적용합니다.

결론

위의 코드를 사용하여 Swift에서 TableFlip 애니메이션을 사용하여 테이블 뷰에서 셀을 드래그 앤 드롭하여 정렬하는 기능을 구현할 수 있습니다. 테이블 뷰의 드래그 앤 드롭 기능을 사용하면 사용자 정의 정렬 작업을 쉽게 구현할 수 있으며, TableFlip과 같은 애니메이션 라이브러리를 사용하여 사용자 경험을 향상시킬 수 있습니다.

참고 자료