Удалить несколько UICollectionViewDropPlaceholder для каждой страницы документа (элемента) - PullRequest
0 голосов
/ 18 апреля 2020

Здравствуйте. Я экспериментирую с перетаскиванием в моем приложении ios и принимаю перетаскивание извне для PDF и изображений, это позволяет пользователю добавлять PDFPages в PDFDocument в v c. Перед отображением ячеек необходимо обработать данные, и, как утверждает Apple, на это потребуется время, поэтому мы должны отобразить заполнитель. Для изображений у меня нет проблем, потому что мне просто нужно отобразить заполнитель для каждого элемента перед обработкой данных. Но для документов в формате PDF это сложнее, потому что я не знаю количество страниц, прежде чем обрабатывать данные. Здесь этот элемент является PDFDocument и может содержать несколько страниц. Так как бы я справился с этим делом?

это код

 for item in coordinator.items {
            let destinationIndexPath = IndexPath(item: destinationIndex, section: 0)
            // should be done for each pdf page
            let cellPlaceholder = UICollectionViewDropPlaceholder(insertionIndexPath: destinationIndexPath, reuseIdentifier: "pdfPagePlaceholderCell")
            cellPlaceholder.previewParametersProvider = { (cell) in
                cell.layer.cornerRadius = 7
                cell.clipsToBounds = true

                let view = UIView()
                view.frame = cell.contentView.frame
                cell.contentView.addSubview(view)
                view.isSkeletonable = true
                let gradient = SkeletonGradient(baseColor: UIColor.skeletonDefault)
                let animation = SkeletonAnimationBuilder().makeSlidingAnimation(withDirection: .topLeftBottomRight)
                view.showAnimatedGradientSkeleton(usingGradient: gradient, animation: animation)

                return UIDragPreviewParameters()
            }
            let placeholderContext = coordinator.drop(item.dragItem, to: cellPlaceholder)

            let session = coordinator.session
            if session.hasItemsConforming(toTypeIdentifiers: [kUTTypeImage as String]) {
                item.dragItem.itemProvider.loadObject(ofClass: UIImage.self) { (img, _) in
                    guard let image = img as? UIImage, let page = PDFPage(image: image) else {
                        DispatchQueue.main.async {
                            placeholderContext.deletePlaceholder()
                        }
                        return
                    }
                    self.initializeDocumentIfNeeded()
                    DispatchQueue.main.async {
                        placeholderContext.commitInsertion(dataSourceUpdates: { (_) in
                            self.pdfDocument?.insert(page, at: destinationIndexPath.item)
                        })
                    }
                }
            } else if session.hasItemsConforming(toTypeIdentifiers: [kUTTypePDF as String]) {
                item.dragItem.itemProvider.loadItem(forTypeIdentifier: kUTTypePDF as String, options: nil) { (pdfData, _) in
                    guard let pdfData = pdfData as? Data, let pdfDoc = PDFDocument(data: pdfData) else { return }

                    print("got pdf document ! with \(pdfDoc.pageCount) pages")
                    self.initializeDocumentIfNeeded()
                    for i in 0..<pdfDoc.pageCount {
                        DispatchQueue.main.async {
                            if let page = pdfDoc.page(at: i) {
                                placeholderContext.commitInsertion(dataSourceUpdates: { (_) in
                                    self.pdfDocument?.insert(page, at: destinationIndexPath.item)
                                })
                                print("inser page at \(destinationIndexPath.item) i is \(i)")
                                // incrementer le indexPath ?
                            } else {
                                placeholderContext.deletePlaceholder()
                            }
                        }
                    }
                    coordinator.drop(item.dragItem, toItemAt: destinationIndexPath)
                }
            }
         }
...