質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

  • Swift

    7694questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4353questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift カメラロールのアルバムを取得して表示することができない

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 469

kizahashi

score 4

Swiftにてアルバムアプリを作っております

以下のコードでカメラロールの写真全てを取得しcollectionviewで表示することはできたのですが、
特定のアルバムを表示することができません

Swift4.1

func grabPhotos(){

        let imgManager = PHImageManager.default()
        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = true
        requestOptions.deliveryMode = .highQualityFormat

        let fetchOptions = PHFetchOptions()

        fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)]


        if let fetchResult:PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions){

         if fetchResult.count > 0 {
            for i in 0..<fetchResult.count{ 
            imgManager.requestImage(for: fetchResult.object(at: i) ,targetSize: CGSize(width: 200, height: 200), contentMode:.aspectFill, options: requestOptions, resultHandler: {image, error in

imageArray.append(image!)
                    })
                }
            }else{
                print("YouGotNoPhotos!")
            }
        }
    }

以下のコードでアルバムを取得することはできているのですが
ここで定義した「collections」をどこにおけばこのアルバムが表示されるのかがわかりません

    let collections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)

まとめますとPHAssetCollection型に入っている写真をどう取得し表示するのかがわかりません

ご回答いただけたら幸いです
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

let collections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)

これの戻り値はPHFetchResult<PHAssetCollection>型(PHAssetCollectionのコレクション)なので、まずobject(at:)等で一つ一つ取り出します。
PHAssetCollection一つが1アルバムに相当するかと思います。

PHAssetCollectionからは以下の関数でPHFetchResult<PHAsset>が取れます。

let assets = PHAsset.fetchAssets(in:, options:)

あとは質問文に書いてある内容と同じ方法でassetから画像が取れます。


2018/06/27追記

サンプルを載せておきます。
エラーチェック等は省いていますので、ご了承ください。

        let imgManager = PHImageManager.default()

        let requestOptions = PHImageRequestOptions()
        requestOptions.isSynchronous = true
        requestOptions.deliveryMode = .highQualityFormat

        let fetchOptions = PHFetchOptions()
        fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

        // アルバムをフェッチ
        let assetCollections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)

        assetCollections.enumerateObjects { assetCollection, _, _ in

            // アルバムタイトル
            print(assetCollection.localizedTitle ?? "")

            // アセットをフェッチ
            let assets = PHAsset.fetchAssets(in: assetCollection, options: fetchOptions)

            assets.enumerateObjects { asset, _, _ in
                // 画像のリクエスト
                imgManager.requestImage(for: asset, targetSize: CGSize(width: 200, height: 200), contentMode:
                    .aspectFill, options: requestOptions, resultHandler: { img, _ in
                    if let img = img {
                        print("画像の取得に成功")
                    }
                })
            }
        }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/26 18:57

    ご回答ありがとうございます。

    takabosoftさんの言う通りobject(at:)でcollectionsを取り出したところPHAssetCollectionになりました。
    さらにlet asset = PHAsset.fetchAssets(in: photos, options: fetchOptions)
    としたらPHFetchResult<PHAsset>を取ることもできました。

    しかし
    ```Swift
    let fetchResult:PHFetchResult = asset.fetchAssets(with: .image, options: nil)
    ```
    のようにPHAssetの部分をassetと替えてみましたが

    Static member 'fetchAssets' cannot be used on instance of type 'PHAsset'
    というエラーがでてしまいます。

    object(at:)で『asset』内の写真を一つづつ取り出そうともしましたが、
    Value of type 'PHAsset' has no member 'count'
    というエラーが出て.countが使えません

    どのようにすれば解決するでしょうか?
    よろしければ返信お願いいたします。

    キャンセル

  • 2018/06/27 09:56

    質問文の`PHAsset.fetchAssets(with: .image, options: fetchOptions)`の戻り値は`PHFetchResult<PHAsset>`型です。`PHAsset.fetchAssets(in:コレクション, options:・・・)` の戻り値の型と一緒です。これで後どうするかはわかりますかね?

    キャンセル

  • 2018/06/27 12:44

    返信ありがとうございます。
    ご教示してもらった通りに書き換え「img」を「imageArray」にappendしたところ
    アルバムの画像をcollectionviewに表示することができました。
    ありがとうございますm(__)m


    今の状態では全てのアルバムの写真が全て表示されてしまっています。

    特定のアルバム、『アルバム1』の写真のみを表示するような時はどうしたら良いでしょうか。試行錯誤してみましたがどこでアルバム名を指定するのかわかりません。
    もしお分かりになりましたら教えていただけると助かります。

    キャンセル

  • 2018/06/27 14:34

    たしか「PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)」はユーザーが作成したアルバムを全列挙する方法だったと思います。アルバムはそれしか取りようがないと思いますので、取った中から選別すれば良いです。assetCollection.localizedTitle == "アルバム1" の時だけ処理を続けるなど。

    キャンセル

  • 2018/06/28 13:49

    返信ありがとうございます。
    if assetCollection.localizedTitle == "アルバム1"{
    imageArray.append(img)
    }
    のようにしたところ指定したアルバムの写真のみを表示することができ無事解決することができました


    takabosoftさん、
    とても助かりました!(°▽°)
    ご回答していただき本当にありがとうございまっす!m(_ _)m
    ios開発頑張ってください!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    7694questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4353questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。