本地相册开发

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..

优化卡顿问题

UICollectionView

  • 尽可能格子不要出现太多,格子不要出现太大
  • 修改控件属性 isOpaque = true、masksToBounds = true、 shouldRasterize = true 、contentsGravitycontentsScale
  • PHCachingImageManager 的属性: allowsCachingHighQualityImages
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
        
        self.imageManager.allowsCachingHighQualityImages = false
    }
    
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        
        if decelerate == false {
            self.imageManager.allowsCachingHighQualityImages = true
        }
    }

你可能感兴趣的:(本地相册开发)