我在 iOS 14 上使用新的 PHPicker 时遇到问题。当我的应用程序请求照片库授权时,系统将提示用户三个选项,如果用户选择“选择照片”,系统将呈现一个 PHPicker,其中用户可以选择我的应用程序可以访问的照片和视频。
但现在PHPicker系统的导航栏看起来太糟糕了,它有黑色的背景和黑色的文本颜色(见下面的链接)。我想知道如何定制它的外观。
非常感谢任何回复!
我正在 SwiftUI 2 中使用新的照片选择器,我制作了一个简单的应用程序来在 LazyVGrid 中显示导入的图像,但是当向下滚动时,如果我导入了大约 150 张图像,该应用程序会完成所有内存并崩溃(由于内存问题)。
我对 LazyVStack 和 List 进行了同样的尝试,但它们有同样的问题,我期待惰性项从内存中释放所有脱离屏幕的单元格,但它看起来似乎不起作用。
这是一个错误还是我做错了什么?
这是我的代码:
import SwiftUI
struct Media: Identifiable {
var id = UUID()
var image: Image
}
struct ContentView: View {
@State var itemProviders: [NSItemProvider] = []
@State private var showingPhotoPicker: Bool = false
let columns = [
GridItem(.adaptive(minimum: 100, maximum: 100), spacing: 8)
]
@State var medias: [Media] = []
var body: some View {
NavigationView {
ScrollView {
LazyVGrid(columns: columns, spacing: 8) {
ForEach(medias) { media …Run Code Online (Sandbox Code Playgroud) 我使用有限照片库功能并选择了一些照片,但是当使用PHPickerViewController在应用程序中选择图像时,PHPickerViewController 会显示图库中的所有图像,而不是之前仅显示一些选定的图像。
是否可以在 PHPickerViewController 中只显示预先选择的图像?如果没有,如何显示预先选择的图像列表,以便用户可以选择之前的 UIImagePickerController。
感谢大家的分享和评论
在WWDC20 中,苹果引入了PHPicker - UIImagePickerController 的现代替代品。
我想知道是否可以使用新的照片选择器检索 PHAsset?
这是我的代码:
private func presentPicker(filter: PHPickerFilter) {
var configuration = PHPickerConfiguration()
configuration.filter = filter
configuration.selectionLimit = 0
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
present(picker, animated: true)
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
dismiss(animated: true)
}
Run Code Online (Sandbox Code Playgroud) 设置:
\n我用来PHPickerViewController允许用户选择照片。我已经实现了PHPickerViewControllerDelegate协议方法picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult])。itemProvider我从结果数组中获取。
问题:
\n我需要访问所选图像的数据。NSItemProviderCalled上有一个方法loadDataRepresentation(),它接受类型标识符字符串,并应在其完成块中返回图像数据。
当我调用这个方法时,有时它会返回数据,有时则不会。我已经对每个提供程序的多个注册类型标识符进行了尝试,并且看到了同样的情况。有时它会返回 JPEG 数据,但不返回 HEIF,有时仅返回 HEIF,有时根本不返回任何数据。这是一致的,因为每次我尝试加载其数据时,同一张照片都会显示相同的结果。
\n当没有数据时,我看到以下错误:
\nUpload preparation for claim D8C281B7-CCCE-4299-95BF-9355FCF340E4 completed with error: Error Domain=NSCocoaErrorDomain Code=260 "The file \xe2\x80\x9c7AB1AB3F-7643-45C1-9DD9-5F5642965C3A.jpeg\xe2\x80\x9d couldn\xe2\x80\x99t be opened because there is no such file."\nRun Code Online (Sandbox Code Playgroud)\n在尝试加载照片数据之前,我需要对照片执行某些操作吗?也许我在这里错过了一步?我直接用 iPhone XR 拍摄的照片会出现这种情况。我没有使用 iCloud 照片,所有照片都在设备上。
\n我需要用户能够从照片库中选择多张照片和视频。(使用 PHPicker)我已经知道如何用这个获取图像:
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
var contentsData: [Data] = []
for result in results {
if result.itemProvider.canLoadObject(ofClass: UIImage.self) {
result.itemProvider.loadObject(ofClass: UIImage.self) { selectedData, error in
if let error = error {
print("PICKER ERROR: \(error)")
} else {
if let selectedImage = selectedData as? UIImage {
if let selectedImageData = selectedImage.jpegData(compressionQuality: 0.5) {
contentsData.append(selectedImageData)
if contentsData.count == results.count {
self.parent.completion(contentsData)
}
}
}
}
}
}
}
self.parent.presentationMode.wrappedValue.dismiss()
}
Run Code Online (Sandbox Code Playgroud)
我假设我需要做的是检查 PHPickerResult 的每个结果是什么数据类型,然后相应地加载每个对象。问题是视频文件可能是 .mov、.mp4 等。如何将 PHPickerResult 识别为视频并进行相应处理?
我有一个 PHPIckerViewController,自 iOS 14 起可用。我想从画廊获取 WEBP 格式的图像。但是 PHPicker 中的项目提供程序无法加载这种格式的图像。请告诉我如何使用新的选择器在 UIButton 上选择和设置图像。
代码:
extension SixStepRegistrationViewController: PHPickerViewControllerDelegate {
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
let supportedRepresentations = [UTType.rawImage.identifier,
UTType.tiff.identifier,
UTType.bmp.identifier,
UTType.png.identifier,
UTType.jpeg.identifier,
UTType.webP.identifier,
]
for representation in supportedRepresentations {
if results[0].itemProvider.hasRepresentationConforming(toTypeIdentifier: representation, fileOptions: .init()) {
print(representation, " repr")
results[0].itemProvider.loadInPlaceFileRepresentation(forTypeIdentifier: representation) { (originalUrl, inPlace, error) in
DispatchQueue.main.async {
print(originalUrl, " ", inPlace)
self.addPhotoButton.setImage(UIImage(contentsOfFile: originalUrl!.path), for: .normal)
//self.dismiss(animated: true, completion: nil)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
谢谢
目前,我正在尝试深入研究 PHPickerViewController 以从照片中同时选择多个图像。所以我想要用户选择的图像数组,我尝试了太多方法但没有运气。这是我的代码,请告诉我有最佳实践吗?
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true, completion: nil)
var images: [UIImage?] = []
var totalConversionsCompleted = 0
for (index,result) in results.enumerated() {
result.itemProvider.loadObject(ofClass: UIImage.self, completionHandler: { (object, error) in
let image = object as? UIImage
images.append(image)
totalConversionsCompleted += 1
if totalConversionsCompleted == index {
print("completion happen \(images)")
}
})
}
}
Run Code Online (Sandbox Code Playgroud) 我想使用 new 从照片中选择图像,PHPickerViewController并且想PHPicker在加载控制器时直接打开。
像这样

import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
// TODO: - Here I want PhotoPicker
}
}
Run Code Online (Sandbox Code Playgroud)