我可以设置图片的顺序吗? PHPickerViewController

问题描述 投票:0回答:1

使用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?
            }
        }
    }
}

enter image description here

例如,如果用户如上图所示选择它,则其进入结果的顺序应该是相同的。

swift image phpickerviewcontroller
1个回答
4
投票

无需外部库,您就可以轻松完成此操作。

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
    }

使用

selectionLimit
0
进行设置,以便当用户点击照片时显示数字。这个数字与他们点击的顺序相对应。

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
        }
    }
}

由于检索照片的过程是异步的,因此可以按任何顺序返回结果。 Apple 似乎没有提供任何附加属性来携带用户的订单选择。因此,我们需要自己标记返回的图像,然后将它们按顺序重新组装到最终的数组中。

如果我们使用

assetIdentifier
设置配置,我们可以利用暴露给我们的
var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
请注意,省略
photoLibrary
参数将阻止我们获取 assetIdentifier,因此请确保使用该实例化!

然后,我们将返回的每个图像存储到字典中,该字典将以

assetIdentifier
作为其键。在对图像发出异步请求之前,我们会将
assetIdentifier
存储到一个数组中,这将为我们提供用户选择的预期顺序。

最后,当所有异步请求完成时,我们通过获取有序键并使用提供相应图像的相同键访问我们的字典,将图像重新组装到有序数组中。

© www.soinside.com 2019 - 2024. All rights reserved.