iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Mobile Development

在 iOS 開發路上的大小事2系列 第 15

【在 iOS 開發路上的大小事2-Day15】PhotoKit 好像很好玩 (4)

  • 分享至 

  • xImage
  •  

在上一篇,有講到 PHAsset、PHAssetResource

在這一篇,會講到該如何應用

取得檔名

首先是檔名的取得,一般要取得檔名的話,會透過 PHAssetResource 取得
像是下面這樣,將要取得檔名的 PHAsset 傳入 PHAssetResource,進而取得檔名

let resource = PHAssetResource.assetResources(for: asset)
let filename = resource.first?.originalFilename ?? ""

那有沒有辦法可以直接透過 PHAsset 來取得檔名呢?答案是有的!
我們可以透過下面這個方法,直接透過 PHAsset 來取得檔名

import PhotoKit

var asset: PHAsset!
asset.value(forKey: "filename")

這個是透過 key-value 的方式取得,感覺有點不是很直觀,讓我們來改寫一下
透過對 PHAsset 進行 extension,像是下面這樣

import PhotoKit

extension PHAsset {
    var fileName: String {
        get {
            return self.value(forKey: "filename") as! String
        }
    }
}

這樣用的時候,就可以看起來直觀一點了

import PhotoKit

var asset: PHAsset!
asset.fileName

請求照片、影片、原況照片

照片

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 的話,寫在這裡
    }
}

影片

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 的話,寫在這裡
    }
}

原況照片

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 來操作

@available(iOS 8, *)
open func performChanges(_ changeBlock: @escaping () -> Void, completionHandler: ((Bool, Error?) -> Void)? = nil)

這邊示範如何修改收藏狀態跟刪除

修改收藏狀態

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))")
    }
}

刪除

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

這裡也附上 GitHub 連結,之後可能還會再新增其他功能上去
有興趣的話,就關注吧~~~


上一篇
【在 iOS 開發路上的大小事2-Day14】PhotoKit 好像很好玩 (3)
下一篇
【在 iOS 開發路上的大小事2-Day16】非黑即白的 Result type
系列文
在 iOS 開發路上的大小事230
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言