目次
スクリーンショット画像の取得方法
まずは、画像を取得するために、Photosフレームワークをインポートします。
import Photos // 画像の取得
Photosフレームワークには残念ながら「スクリーンショット」を直接指定する特定のメディアタイプが提供されていないので、アルバムを1つずつ確認して、「スクリーンショット」アルバムを取り出して、写真を抽出します。
サンプルコードは次の通りです。
// スクショの取得
private func fetchScreenshots() {
// 写真アルバムを取得
let albumsPhoto:PHFetchResult<PHAssetCollection> = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
// 取得したアルバムを一つずつ確認
albumsPhoto.enumerateObjects { collection, _, _ in
// アルバムが「Screenshots」であるか確認
if collection.localizedTitle == "Screenshots" {
// 写真アセットを非同期で読み込むためのオプションを設定
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] // 作成日時でソート
options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) // 画像メディアタイプの写真だけを取得
// アルバム内の写真アセットを非同期で取得
let fetchResult = PHAsset.fetchAssets(in: collection, options: options)
// スクリーンショットのアセットを格納するための配列を用意
var screenshots: [PHAsset] = []
// アルバム内の写真アセットを一つずつ確認
fetchResult.enumerateObjects { asset, _, _ in
// 写真アセットのメディアタイプが画像であるか確認
if asset.mediaType == .image {
// 画像であれば、スクリーンショットとして配列に追加
screenshots.append(asset)
}
}
// スクリーンショットの数を出力
print("Screenshots albums count: \(screenshots.count)")
}
}
}
UIも含めたサンプルコード
import SwiftUI
import Photos // 画像の取得(PHAssetクラスを使用するため)
struct PhotoGridView: View {
@State private var photos: [PHAsset] = []
var body: some View {
NavigationView {
ScrollView {
LazyVGrid(columns: Array(repeating: GridItem(), count: 3), spacing: 1) {
ForEach(photos, id: \.self) { asset in
PhotoGridItem(asset: asset)
.padding(.horizontal, 1)
}
}
.padding()
}
.navigationTitle("スクショ一覧")
}
.onAppear {
// 画像の取得
fetchScreenshots()
print(photos.count)
}
}
// スクショの取得
private func fetchScreenshots() {
// 写真アルバムを取得
let albumsPhoto:PHFetchResult<PHAssetCollection> = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
// 取得したアルバムを一つずつ確認
albumsPhoto.enumerateObjects { collection, _, _ in
// アルバムが「Screenshots」であるか確認
if collection.localizedTitle == "Screenshots" {
// 写真アセットを非同期で読み込むためのオプションを設定
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] // 作成日時でソート
options.predicate = NSPredicate(format: "mediaType = %d", PHAssetMediaType.image.rawValue) // 画像メディアタイプの写真だけを取得
// アルバム内の写真アセットを非同期で取得
let fetchResult = PHAsset.fetchAssets(in: collection, options: options)
// スクリーンショットのアセットを格納するための配列を用意
var screenshots: [PHAsset] = []
// アルバム内の写真アセットを一つずつ確認
fetchResult.enumerateObjects { asset, _, _ in
// 写真アセットのメディアタイプが画像であるか確認
if asset.mediaType == .image {
// 画像であれば、スクリーンショットとして配列に追加
screenshots.append(asset)
photos = screenshots
}
}
// スクリーンショットの数を出力
print("Screenshots albums count: \(screenshots.count)")
}
}
}
}
struct PhotoGridItem: View {
let asset: PHAsset
var body: some View {
Image(uiImage: loadImage())
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: UIScreen.main.bounds.width / 3, height: UIScreen.main.bounds.width / 3) // 画面の横幅の1/3を設定
.clipped()
.onTapGesture {
// 画像をタップしたときの処理を追加
}
}
private func loadImage() -> UIImage {
let manager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
requestOptions.deliveryMode = .highQualityFormat // 高品質の画像を要求
var image = UIImage()
manager.requestImage(for: asset, targetSize: CGSize(width: 500, height: 500), contentMode: .aspectFill, options: requestOptions) { (result, _) in
if let result = result {
image = result
}
}
return image
}
}
#Preview {
PhotoGridView()
}
Comment