如何从 PHPickerViewController 委托中获取实时照片或视频
How to fetch live photo or video from PHPickerViewController delegate
Apple 的新 iOS14 PHPickerViewController 委托仅接收一个 NSItemProvider。 2020 WWDC 视频展示了如何从那里获得 UIImage:
let prov = result.itemProvider
prov.loadObject(ofClass: UIImage.self) { im, err in
if let im = im as? UIImage {
DispatchQueue.main.async {
// display the image here
但是如果用户选择了实时照片或视频呢?我们如何得到它?
现场照片很容易;以完全相同的方式做。您可以这样做,因为 PHLivePhoto 是 class。所以:
let prov = result.itemProvider
prov.loadObject(ofClass: PHLivePhoto.self) { livePhoto, err in
if let photo = livePhoto as? PHLivePhoto {
DispatchQueue.main.async {
// display the live photo here
视频更难。问题是你不想被交给数据;它对你没有好处,而且可能会很大。您希望将数据保存到磁盘,以便您可以访问视频 URL,就像 UIImagePickerController 过去所做的那样。事实上,您可以要求项目提供者为您保存其数据,但它希望在完成处理程序 returns 时放弃该数据。我的解决方案是在 .sync
函数中访问 URL:
let prov = result.itemProvider
prov.loadFileRepresentation(forTypeIdentifier: UTType.movie.identifier) { url, err in
if let url = url {
DispatchQueue.main.sync {
// display the video here
Apple 的新 iOS14 PHPickerViewController 委托仅接收一个 NSItemProvider。 2020 WWDC 视频展示了如何从那里获得 UIImage:
let prov = result.itemProvider
prov.loadObject(ofClass: UIImage.self) { im, err in
if let im = im as? UIImage {
DispatchQueue.main.async {
// display the image here
但是如果用户选择了实时照片或视频呢?我们如何得到它?
现场照片很容易;以完全相同的方式做。您可以这样做,因为 PHLivePhoto 是 class。所以:
let prov = result.itemProvider
prov.loadObject(ofClass: PHLivePhoto.self) { livePhoto, err in
if let photo = livePhoto as? PHLivePhoto {
DispatchQueue.main.async {
// display the live photo here
视频更难。问题是你不想被交给数据;它对你没有好处,而且可能会很大。您希望将数据保存到磁盘,以便您可以访问视频 URL,就像 UIImagePickerController 过去所做的那样。事实上,您可以要求项目提供者为您保存其数据,但它希望在完成处理程序 returns 时放弃该数据。我的解决方案是在 .sync
函数中访问 URL:
let prov = result.itemProvider
prov.loadFileRepresentation(forTypeIdentifier: UTType.movie.identifier) { url, err in
if let url = url {
DispatchQueue.main.sync {
// display the video here