在 SwiftUI 中使用 UIImagePickerController 选择视频
Picking a video using UIImagePickerController in SwiftUI
我最近开始在 SwiftUI 上进行开发,现在我在尝试通过将 Data
存储在 imageData
中来显示我从 UIImagePicker
中挑选的视频时遇到困难函数 imagePickerController
这是我的代码:
struct ImagePicker: UIViewControllerRepresentable {
@Binding var pickedImage: Image
@Binding var imageData: Data
@Binding var isShown: Bool
@Binding var url: URL?
class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@Binding var isShown: Bool
@Binding var url: URL?
// I have tried using a new variable (parentImagePicker) here and I added it to the initializer so that I can store the imageData in it in the function (imagePickerController) below but I wasn't able to implement it correctly
init( isShown: Binding<Bool>, url: Binding<URL?>) {
_isShown = isShown
_url = url
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let mediaType = info[.mediaType] as? String,
mediaType == (kUTTypeMovie as String),
let uiURL = info[.mediaURL] as? URL
else { return }
url = uiURL
isShown = false
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
isShown = false
}
}
func makeCoordinator() -> Coordinator {
return Coordinator( isShown: $isShown, url: $url)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.mediaTypes = [kUTTypeMovie as String]
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ uiViewController: UIImagePickerController,
context: UIViewControllerRepresentableContext<ImagePicker>) {
}
}
fileprivate func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: [UIImagePickerController.InfoKey: Any]) -> [String: Any] {
return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})
}
fileprivate func convertFromUIImagePickerControllerInfoKey(_ input: UIImagePickerController.InfoKey) -> String {
return input.rawValue
}
您不应该将视频中的数据保存在内存中。它太大了!您已在磁盘上获得视频文件的 URL。这就是你所需要的。 URL 可能是临时的,因此请立即告诉文件管理器将文件复制到某个安全位置,例如 Documents 文件夹。 (复制,不要移动;你可能没有移动它的权限。)现在当你想播放视频时,使用Documents文件夹中新的URL视频文件就可以了。
我最近开始在 SwiftUI 上进行开发,现在我在尝试通过将 Data
存储在 imageData
中来显示我从 UIImagePicker
中挑选的视频时遇到困难函数 imagePickerController
这是我的代码:
struct ImagePicker: UIViewControllerRepresentable {
@Binding var pickedImage: Image
@Binding var imageData: Data
@Binding var isShown: Bool
@Binding var url: URL?
class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@Binding var isShown: Bool
@Binding var url: URL?
// I have tried using a new variable (parentImagePicker) here and I added it to the initializer so that I can store the imageData in it in the function (imagePickerController) below but I wasn't able to implement it correctly
init( isShown: Binding<Bool>, url: Binding<URL?>) {
_isShown = isShown
_url = url
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let mediaType = info[.mediaType] as? String,
mediaType == (kUTTypeMovie as String),
let uiURL = info[.mediaURL] as? URL
else { return }
url = uiURL
isShown = false
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
isShown = false
}
}
func makeCoordinator() -> Coordinator {
return Coordinator( isShown: $isShown, url: $url)
}
func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> UIImagePickerController {
let picker = UIImagePickerController()
picker.mediaTypes = [kUTTypeMovie as String]
picker.delegate = context.coordinator
return picker
}
func updateUIViewController(_ uiViewController: UIImagePickerController,
context: UIViewControllerRepresentableContext<ImagePicker>) {
}
}
fileprivate func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: [UIImagePickerController.InfoKey: Any]) -> [String: Any] {
return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})
}
fileprivate func convertFromUIImagePickerControllerInfoKey(_ input: UIImagePickerController.InfoKey) -> String {
return input.rawValue
}
您不应该将视频中的数据保存在内存中。它太大了!您已在磁盘上获得视频文件的 URL。这就是你所需要的。 URL 可能是临时的,因此请立即告诉文件管理器将文件复制到某个安全位置,例如 Documents 文件夹。 (复制,不要移动;你可能没有移动它的权限。)现在当你想播放视频时,使用Documents文件夹中新的URL视频文件就可以了。