###### tags: `第14屆IT邦鐵人賽文章`
# 【在 iOS 開發路上的大小事2-Day15】PhotoKit 好像很好玩 (4)
在上一篇,有講到 PHAsset、PHAssetResource
在這一篇,會講到該如何應用
## 取得檔名
首先是檔名的取得,一般要取得檔名的話,會透過 PHAssetResource 取得
像是下面這樣,將要取得檔名的 PHAsset 傳入 PHAssetResource,進而取得檔名
```swift
let resource = PHAssetResource.assetResources(for: asset)
let filename = resource.first?.originalFilename ?? ""
```
那有沒有辦法可以直接透過 PHAsset 來取得檔名呢?答案是有的!
我們可以透過下面這個方法,直接透過 PHAsset 來取得檔名
```swift
import PhotoKit
var asset: PHAsset!
asset.value(forKey: "filename")
```
這個是透過 key-value 的方式取得,感覺有點不是很直觀,讓我們來改寫一下
透過對 PHAsset 進行 extension,像是下面這樣
```swift
import PhotoKit
extension PHAsset {
var fileName: String {
get {
return self.value(forKey: "filename") as! String
}
}
}
```
這樣用的時候,就可以看起來直觀一點了
```swift
import PhotoKit
var asset: PHAsset!
asset.fileName
```
## 請求照片、影片、原況照片
### 照片
```swift
let imageManager = PHImageManager.default()
let photosImageRequestOptions = PHImageRequestOptions()
photosImageRequestOptions.deliveryMode = .highQualityFormat // 高畫質
photosImageRequestOptions.isNetworkAccessAllowed = true // 是否允許從 iCloud 下載
imageManager.requestImage(for: asset,
targetSize: PHImageManagerMaximumSize,
contentMode: .aspectFit,
options: photosImageRequestOptions) { image, _ in
guard let results = image else {
return
}
DispatchQueue.main.async {
// 如果有要處理 UI 的話,寫在這裡
}
}
```
### 影片
```swift
let imageManager = PHImageManager.default()
let videoRequestOptions = PHVideoRequestOptions()
videoRequestOptions.deliveryMode = .highQualityFormat // 高畫質
videoRequestOptions.isNetworkAccessAllowed = true // 是否允許從 iCloud 下載
imageManager.requestPlayerItem(forVideo: asset,
options: videoRequestOptions) { playerItem, info in
DispatchQueue.main.async {
// 如果有要處理 UI 的話,寫在這裡
}
}
```
### 原況照片
```swift
let imageManager = PHImageManager.default()
let livePhotoImageRequestOptions = PHLivePhotoRequestOptions()
livePhotoImageRequestOptions.deliveryMode = .highQualityFormat // 高畫質
livePhotoImageRequestOptions.isNetworkAccessAllowed = true // 是否允許從 iCloud 下載
imageManager.requestLivePhoto(for: asset,
targetSize: PHImageManagerMaximumSize,
contentMode: .aspectFit,
options: livePhotoImageRequestOptions) { livePhoto, info in
guard let results = livePhoto else {
return
}
DispatchQueue.main.async {
// 如果有要處理 UI 的話,寫在這裡
}
}
```
## 修改 Asset 狀態
不論是要進行收藏、刪除或是其他操作,都會需要透過下面這個 Function 來操作
```swift
@available(iOS 8, *)
open func performChanges(_ changeBlock: @escaping () -> Void, completionHandler: ((Bool, Error?) -> Void)? = nil)
```
這邊示範如何修改收藏狀態跟刪除
### 修改收藏狀態
```swift
PHPhotoLibrary.shared().performChanges {
let request = PHAssetChangeRequest(for: self.asset)
request.isFavorite = !self.asset.isFavorite
print("該張照片修改後的收藏狀態:\(request.isFavorite)")
} completionHandler: { success, error in
// 如果有要處理 UI 的話,寫在這裡
if success {
print("收藏狀態修改成功")
} else {
print("收藏狀態修改失敗, Error Message:\(String(describing: error?.localizedDescription))")
}
}
```
### 刪除
```swift
PHPhotoLibrary.shared().performChanges {
PHAssetChangeRequest.deleteAssets([self.asset] as NSArray)
} completionHandler: { success, error in
DispatchQueue.main.async {
if success {
PHPhotoLibrary.shared().unregisterChangeObserver(self)
print("刪除成功")
self.navigationController!.popViewController(animated: true)
} else {
print("刪除失敗, Error Message:\(String(describing: error?.localizedDescription))")
}
}
}
```
## 總結
PhotoKit 還有很多東西可以玩
這裡主要是以自己的 App 來做簡單介紹,並補充一些相關用法、資訊
如果想了解更多 PhotoKit 的奧秘的話,可以參考 [Apple Developer Documentation](https://developer.apple.com/documentation/photokit)
這裡也附上 [GitHub 連結](https://github.com/leoho0722/PhotoKitDemo),之後可能還會再新增其他功能上去
有興趣的話,就關注吧~~~