使用PHPickerViewController,将显示所选图像的结果。我可以设置图像的顺序吗?
private func makePickerViewController(selectionLimit: Int) -> PHPickerViewController {
var config = PHPickerConfiguration()
config.selectionLimit = selectionLimit
config.filter = PHPickerFilter.images
let pickerViewController = PHPickerViewController(configuration: config)
return pickerViewController
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true, completion: nil)
for (index, result) in results.enumerated() {
let itemProvider = result.itemProvider
if itemProvider.canLoadObject(ofClass: UIImage.self) {
itemProvider.loadFileRepresentation(forTypeIdentifier: "public.image") { (url, error) in
// How can you determine the order of the selected images?
}
}
}
}
在此处输入图像描述
例如,如果用户如上图所示选择它,那么它进入结果的顺序应该是相同的。
在没有外部库的情况下,您可以很容易地做到这一点。
func makeUIViewController(context: Context) -> PHPickerViewController {
var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
config.filter = .images
config.selection = .ordered
config.selectionLimit = 0
let picker = PHPickerViewController(configuration: config)
picker.delegate = context.coordinator
return picker
}
使用0
的selectionLimit
将其设置为使得当用户点击照片时显示数字。这个数字与他们敲击的顺序一致。
class Coordinator: NSObject, PHPickerViewControllerDelegate {
let parent:ImagePicker
init(_ parent:ImagePicker) {
self.parent = parent
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true)
let group = DispatchGroup()
var images = [UIImage]()
var order = [String]()
var asyncDict = [String:UIImage]()
for result in results {
order.append(result.assetIdentifier ?? "")
group.enter()
let provider = result.itemProvider
if provider.canLoadObject(ofClass: UIImage.self) {
provider.loadObject(ofClass: UIImage.self) { image, _ in
guard let updatedImage = image as? UIImage else {group.leave();return}
asyncDict[result.assetIdentifier ?? ""] = updatedImage
group.leave()
}
}
}
group.notify(queue: .main) {
for id in order {
images.append(asyncDict[id]!)
}
self.parent.images = images
}
}
}
由于检索照片的过程是异步的,因此可以按任何顺序返回结果。苹果似乎没有提供任何额外的属性来携带用户的订单选择。因此,我们需要自己标记返回的图像,然后将它们按顺序重新组装到最终阵列中。
如果我们使用var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
设置配置,我们可以使用暴露在我们面前的assetIdentifier
。请注意,省略photoLibrary
参数会阻止我们获得assetIdentifier,所以请确保使用该实例化!
然后,我们将返回的每个图像存储在一个字典中,该字典将以assetIdentifier
为关键字。就在对图像发出异步请求之前,我们将把assetIdentifier
存储到一个数组中,该数组将为我们提供用户选择的预期顺序。
最后,当所有异步请求完成时,我们通过获取有序键并使用提供相应图像的相同键访问字典,将图像重新组装到有序数组中。