PHAsset
- 照片库中的一个单独的资源(狭隘可以理解为一张图或则一段视频),以元数据的方式提供,包含所有该资源的信息(例如:唯一标识、创建时间、大小、类型、地点、是否被标记为喜欢等)
- 用来获取照片库中的PHAsset对象
判断资源类型
- 通过PHAsset的PHAssetMediaType判断是image还是video
public enum PHAssetMediaType : Int {
case unknown // 未知
case image // 图片
case video // 视频
case audio // 音频
}
- 判断是否是实时照片PHLivePhoto(iOS9.1+ 6s及以上支持 和PHAsset一样也是一个资源包,不同的是他不仅包含一张图片,而且还有一段mov格式的视频(拍摄该照片时前后几秒的视频))
if #available(iOS 9.1, *) {
if asset.mediaSubtypes.contains(.photoLive) {
// 实时照片(以后可以加重压播放视频 用户可以选择时使用照片还是使用视频)
}
}
- 判断是否是iCloud图
@objc open class func judgeAssetis(inLocalAblum asset: PHAsset?) -> Bool {
var result = false
let option = PHImageRequestOptions()
option.isNetworkAccessAllowed = false
option.isSynchronous = true
if let asset = asset {
PHCachingImageManager.default().requestImageData(for: asset, options: option, resultHandler: { imageData, _, _, _ in
result = imageData != nil ? true : false
})
}
return result
}
- 获取视频时长
// 视频时长
class open func videoDuration(videoAsset: PHAsset?) -> String {
guard let asset = videoAsset else { return "00:00" }
let duration: TimeInterval = asset.duration
let s: Int = Int(duration) % 60
let m: Int = Int(duration) / 60
let formattedDuration = String(format: "%02d:%02d", m, s)
return formattedDuration
}
写入资源到相册(图片、视频、PHotoLive等)
1、写入照片(通过image或则Url)
PHPhotoLibrary.shared().performChanges({
if let image = resource as? UIImage {
PHAssetChangeRequest.creationRequestForAsset(from: image)
} else if let url = resource as? URL {
assetRequest = PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
}
}) { (success, error) in
print("保存成功:\(success)")
}
2、写入视频
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: url)
}) { (success, error) in
print("保存成功:\(success)")
}
3、写入PhotoLive
注意:videoUrl和photoUrl需要有关联(例如:photoUrl的图片是video的第几帧。如果俩者没关联就会保存是被)
let videoUrl = URL.init(fileURLWithPath: Bundle.main.path(forResource: "1", ofType: "mov")!)
PHPhotoLibrary.shared().performChanges({
let assetRequest = PHAssetCreationRequest.forAsset()
assetRequest.addResource(with: .photo, fileURL: photoUrl, options: nil)
assetRequest.addResource(with: .pairedVideo, fileURL: videoUrl, options: nil)
}) { (success, error) in
if success {
self.showAlert(message: "新增LivePhoto成功")
} else {
self.showAlert(message: "新增LivePhoto失败")
}
}
收藏或取消
// 收藏或取消asset
open class func toggleFavorite(asset: PHAsset, completionHandler: ((Bool, Error?) -> Swift.Void)? = nil) {
PHPhotoLibrary.shared().performChanges({
let request = PHAssetChangeRequest(for: asset)
request.isFavorite = !asset.isFavorite
}, completionHandler: completionHandler)
}
修改照片添加时间
// 修改照片添加时间
open class func changeAssetDate(asset: PHAsset, date: Date, completionHandler: ((Bool, Error?) -> Swift.Void)? = nil) {
PHPhotoLibrary.shared().performChanges({
let request = PHAssetChangeRequest(for: asset)
request.creationDate = date
}, completionHandler: completionHandler)
}
修改照片定位地点
// 修改照片定位地点
open class func changeAssetLocation(asset: PHAsset, location: CLLocation, completionHandler: ((Bool, Error?) -> Swift.Void)? = nil) {
PHPhotoLibrary.shared().performChanges({
let request = PHAssetChangeRequest(for: asset)
request.location = location
}, completionHandler: completionHandler)
}
修改照片是否隐藏
// 修改照片是否隐藏
open class func changeAssetIsHide(asset: PHAsset, completionHandler: ((Bool, Error?) -> Swift.Void)? = nil) {
PHPhotoLibrary.shared().performChanges({
let request = PHAssetChangeRequest(for: asset)
request.isHidden = !asset.isHidden
}, completionHandler: completionHandler)
}