Здравствуйте. Я экспериментирую с перетаскиванием в моем приложении 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)
}
}
}