iOS14選擇相冊適配問題。
在iOS14之后新增了
Limited Photo Library Access模式,在授權(quán)彈窗中增加了 Select Photo 選項(xiàng)(如圖1,就是第一個(gè)選項(xiàng) ‘選擇照片...’)。
選中之后就跳轉(zhuǎn)到系統(tǒng)的PHPickerViewController進(jìn)行選擇圖片(如圖2)。
如果不適配會(huì)導(dǎo)致一些問題。
| 圖1 | 圖2 |
|---|---|
![]() 圖1.jpg
|
![]() 圖2.jpg
|
具體解決方案,更新API。然后在調(diào)用相機(jī)的時(shí)候,判斷一下是否是limited。如果是的話,我們就給一個(gè)提示(讓他去更改權(quán)限提示),并且可以讓用戶選擇重新選擇可用的照片,具體代碼如下:
在iOS 14新增兩個(gè)API,要更新一下
/// accessLevel 我們選擇 readWrite 就行了
@available(iOS 14, *) //獲取當(dāng)前相冊權(quán)限 accessLevel是權(quán)限等級
open class func authorizationStatus(for accessLevel: PHAccessLevel) -> PHAuthorizationStatus
@available(iOS 14, *) //發(fā)起相冊權(quán)限請求 accessLevel是權(quán)限等級
open class func requestAuthorization(for accessLevel: PHAccessLevel, handler: @escaping (PHAuthorizationStatus) -> Void)
然后在你的相冊中添加下面判斷代碼
var authorizationStatus = PHPhotoLibrary.authorizationStatus()
if #available(iOS 14, *) {
authorizationStatus = PHPhotoLibrary.authorizationStatus(for: .readWrite)
}
if #available(iOS 14, *) {
if authorizationStatus == .limited {
//這里可以添加提示 。代碼我就不放了如圖3
//還可以添加UIAlertController選擇彈框,點(diǎn)擊 選擇更多照片... 調(diào)用下面代碼。如圖4
//[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];
}
}
點(diǎn)擊 選擇更多照片... 調(diào)用下面代碼。如圖4
[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];
| 圖3 | 圖4 |
|---|---|
![]() 圖3
|
![]() 圖4
|
假如你就簡單的改變一個(gè)頭像,推薦PHPickerViewController,這iOS14之后官方推薦的??蛇ximages,videos,livePhotos等
if #available(iOS 14.0, *) {
var configuration = PHPickerConfiguration.init()
configuration.filter = PHPickerFilter.any(of: [PHPickerFilter.images,PHPickerFilter.videos,PHPickerFilter.livePhotos])
configuration.selectionLimit = 1
let picker = PHPickerViewController.init(configuration: configuration)
picker.delegate = self
picker.view.backgroundColor = UIColor.blue
picker.modalPresentationStyle = .fullScreen
self.present(picker, animated: true) {
}
}
//MARK: PHPickerViewControllerDelegate
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
if results.count == 0 {
return
}
let itemProvider = results.first?.itemProvider
if itemProvider?.canLoadObject(ofClass: UIImage.classForCoder() as! NSItemProviderReading.Type) == true {
itemProvider?.loadObject(ofClass: UIImage.classForCoder() as! NSItemProviderReading.Type, completionHandler: { object, error in
print(object as Any)
})
}
//在回調(diào)中調(diào)用消失方法
picker.dismiss(animated: true) {
}
}



