PHFetchResult
相簿内的资源,用了存放的PHAsset
结果中的内容可以像使用NSArray
类的方法获取内容一样来获取PHFetchResult
中的内容。一个PHFetchResult
对象中的内容是动态加载的,如果你需要一些内容它才会去照片库中去获取对应的内容,这可以在处理大量的结果的时候提供一个最佳的性能。
PHCachingImageManager
带缓存的图片管理对象
stopCachingImagesForAllAssets
: 方法
allowsCachingHighQualityImages
:方法
requestImage
:获取缩略图方法
PHImageRequestOptions
配置获取请求参数
synchronous
: 同步获取图片、多图、高清会太卡
deliveryMode
:请求的图像质量和交付优先级
// 为了平衡图像质量和响
case opportunistic
// 只提供最高质量的图像,无论它需要多少时间加载
case highQualityFormat
// 最快速的得到一个图像结果,可能会牺牲图像质量
case fastFormat
resizeMode
:请求图像数据时将图像与目标大小如何适应
// 不做任何调整
case none
// 最快速的调整图像大小,有可能比给定大小
case fast
// 保证与给定大小相等
case exact
代码
self.requestOptions?.deliveryMode = PHImageRequestOptionsDeliveryMode.highQualityFormat
self.requestOptions?.resizeMode = PHImageRequestOptionsResizeMode.exact
PHAsset
mediaType
: 类型
// 未知
case unknown
// 图片
case image
// 视频
case video
// 音频
case audio
获取文件大小
PHAssetResource *resource = [[PHAssetResource assetResourcesForAsset:self.phasset] firstObject];
long long size = [[resourcevalueForKey:@"fileSize"] longLongValue];
let result :PHAssetResource = PHAssetResource.assetResources(for: asset).first!
let size = NSString(format: "%d", result.value(forKey: "fileSize") as! UInt64).floatValue
PHPhotoLibrary
requestAuthorization
: 申请权限
performChangesAndWait
:方法
图片保存到指定的相册中
do{
try PHPhotoLibrary.shared().performChangesAndWait({
// 安全校验
if createdAssetId.count > 0 {
// 获取系统相册文件
let createdAssets:PHFetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [createdAssetId], options: nil)
let request: PHAssetCollectionChangeRequest = PHAssetCollectionChangeRequest.init(for: collection as! PHAssetCollection)!
request.insertAssets(createdAssets, at: NSIndexSet.init(index: 0) as IndexSet)
}else {
print("报错 url: \(createdAssetId)")
}
})
}catch{
print("保存指定相册 error:\(error)")
}
} catch{
print("打印报错1: \(error)")
}
PHFetchOptions
PHAssetCollection
fetchAssetCollections
:方法
PHCollectionList
fetchTopLevelUserCollections
:方法
由于系统返回的相册集名称为英文,我们需要转换为中文
private func titleOfAlbumForChinse(title:String?) -> String? {
if title == "Slo-mo" {
return "慢动作"
} else if title == "Recently Added" {
return "最近添加"
} else if title == "Favorites" {
return "个人收藏"
} else if title == "Recently Deleted" {
return "最近删除"
} else if title == "Videos" {
return "视频"
} else if title == "All Photos" {
return "所有照片"
} else if title == "Selfies" {
return "自拍"
} else if title == "Screenshots" {
return "屏幕快照"
} else if title == "Camera Roll" {
return "相机胶卷"
}
return title
}
生成自定义相册
// 获取App 名称
let title: String = Bundle.main.infoDictionary!["CFBundleDisplayName"] as! String
print("打印相册名称: \(title)")
// 相册
var collection :PHCollection? = nil
//列出所有用户创建的相册
let userCollections = PHCollectionList.fetchTopLevelUserCollections(with: nil)
let count:Int = userCollections.count
for i in 0..<count {
let c = userCollections[i]
let cName: String = c.localizedTitle!
print("打印 用户创建的相册:\(cName) title:\(title)")
if cName == title {
collection = c
break;
}
}
// 生成app相册
if collection == nil {
// 相册唯一识别ID
var createdCollectionID: String?
do {
try PHPhotoLibrary.shared().performChangesAndWait {
//创建一个相册,拿到相册的唯一标识符
createdCollectionID = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: title).placeholderForCreatedAssetCollection.localIdentifier
}
}catch{
print("creationRequest.error: \(error)")
}
// 获取相册
collection = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [createdCollectionID!], options: nil).firstObject
}
return collection!
优化卡顿问题
UICollectionView
- 尽可能格子不要出现太多,格子不要出现太大
- 修改控件属性
isOpaque
= true、masksToBounds
= true、shouldRasterize
= true 、contentsGravity
、contentsScale
- PHCachingImageManager 的属性:
allowsCachingHighQualityImages
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
self.imageManager.allowsCachingHighQualityImages = false
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if decelerate == false {
self.imageManager.allowsCachingHighQualityImages = true
}
}