Пустое поле выбора изображения UIImagePickerController и PHPickerViewController в iOS14
Если бы это работало на последних нескольких версиях iOS, но на 14 не удалось заставить это работать, я провел последние 5 дней в Google.
Когда я иду добавить изображение из галереи, всплывающее окно для выбора изображения пустое.
Я пробовал UIImagePickerController(который отлично работает с iOS13 и ниже) и новый PHPickerViewController.
До iOS14 работало то, что пользователь нажимает кнопку панели, чтобы "добавить изображение", и всплывающее окно предлагает выбрать из галереи, а затем представляет средство выбора изображений в вашей галерее.
Я установил Info.plist "Конфиденциальность - описание использования библиотеки фотографий" для UIImagePickerController, я знаю, что PHPickerViewController не нуждается в химической завивке, поскольку он обрабатывает получение изображения за вас.
Я также время от времени встречал это пурпурное предупреждение, в котором говорилось, что "xxxx необходимо использовать только из основного потока", никогда не видел этого раньше до нового Xcode.
Любая помощь приветствуется. Запуск Xcode 12.0.1 (12A7300), симуляторы под управлением iOS14.
Адам
class AddCustomExerciseViewController: UIViewController, UITextViewDelegate, UINavigationControllerDelegate, GADBannerViewDelegate, UIImagePickerControllerDelegate, PHPickerViewControllerDelegate{
let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in self.openGallery() }))
alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))
self.present(alert, animated: true, completion: nil)
func openGallery()
{
let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
switch photoAuthorizationStatus {
case .authorized:
self.showGallery()
print("Access is granted by user")
case .notDetermined:
PHPhotoLibrary.requestAuthorization({
(newStatus) in
print("status is \(newStatus)")
if newStatus == PHAuthorizationStatus.authorized {
self.showGallery()
print("success")
}
})
print("It is not determined until now")
case .restricted:
// same same
print("User do not have access to photo album.")
case .denied:
// same same
print("User has denied the permission.")
case .limited:
// same same
print("User has denied the permission.")
}
}
func showGallery()
{
if #available(iOS 14, *)
{
var configuration = PHPickerConfiguration()
configuration.filter = .images
configuration.selectionLimit = 0
let picker = PHPickerViewController(configuration: configuration)
picker.delegate = self
self.present(picker, animated: true, completion: nil)
}
else
{
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.allowsEditing = false
imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}
else
{
let alert = UIAlertController(title: "Warning", message: "You don't have permission to access gallery.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
//get the file url
if let fileUrl = info[UIImagePickerControllerImageURL] as? URL {
print(fileUrl)
print(fileUrl.lastPathComponent)
let filePath = fileUrl.lastPathComponent
if(filePath.hasSuffix("GIF")||filePath.hasSuffix("gif"))
{
//to change later to support gifs
gifView.image = pickedImage
}
else
{
//to show the static image to users
gifView.image = pickedImage
}
//for saving the file name to retrieve in local parse datastore
imageNameToSave = fileUrl.lastPathComponent
}
//for saving the selected image
imageToSave = pickedImage
}
picker.dismiss(animated: true, completion: nil)
}
@available(iOS 14, *)
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult])
{
picker.dismiss(animated: true, completion: nil)
for result in results
{
result.itemProvider.loadObject(ofClass: UIImage.self, completionHandler: { (object, error) in
if let image = object as? UIImage {
DispatchQueue.main.async {
// Use UIImage
print("Selected image: \(image)")
}
}
})
}
} }
2 ответа
В iOS 14 диалоговое окно разрешения ограниченного выбора изображений открывается в отдельном потоке, поэтому при возврате авторизации вам нужно будет выполнять задачи пользовательского интерфейса в основном потоке.
PHPhotoLibrary.requestAuthorization({
(newStatus) in
DispatchQueue.main.async {
print("status is \(newStatus)")
if newStatus == PHAuthorizationStatus.authorized {
self.showGallery()
print("success")
}
}
})
Если это полезно для кого-то еще, я обнаружил, что редактирование фона прокси-сервера для просмотра прокрутки вызвало ошибку как в UIImagePickerController, так и в PHPickerViewController, не позволяющую им отображать изображения в iOS 14 и выше. Я отредактировал фоновый прокси для просмотра прокрутки, потому что он черный даже в светлом режиме. После нескольких часов поиска в Google и тестирования я обнаружил, что удаление модификации фона внешнего вида на прокси-сервере scrollview позволило средствам выбора изображений функционировать должным образом. Я отправил отчет об ошибке в Apple. Строка кода, вызвавшая ошибку, была следующей:
UIScrollView.appearance().backgroundColor = .systemBackground