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

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

ただいまの
回答率

90.36%

  • Swift

    8182questions

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

  • Xcode

    4614questions

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

  • iOS

    4382questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

※至急※ swiftで指定したアルバムから画像を取得したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,617

wakuwakuWTP

score 8

前提・実現したいこと

撮った写真を自分で作成したアルバムに保存することはできましたが、
逆に指定のアルバムから画像を取得することができなくてこまっています。

以下のソースではiPnoheのカメラロールの画像すべてが取得できてしまいます。
アルバムを指定して画像を取得するにはどうすればよいでしょうか?
アドバイスをお願い致します。

[追記]
質問に対して、ご指摘ありがとうございます。
また、投げやりな質問で大変失礼致しました。気をつけたいと思います。

やりたいことは指定のアルバム(MyCollection)から画像を取得してCollectionViewに表示したいです。
色々自分なりに調べ、なんとかアルバムの写真のデータを取得できました。
しかし、CollectionViewで表示すると最後の1枚しか表示されませんでした。
(アルバム「MyCollection」には3枚写真があります)

配列の入れ方に問題があるのでしょうか。

該当のソースコード

var photoAssets = [PHAsset]()

func getPhotos() {
    photoAssets = []

    var assets: PHFetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: nil)
    assets.enumerateObjectsUsingBlock { (asset, index, stop) -> Void in
        self.photoAssets.append(asset as PHAsset)
    }
    println(photoAssets)
}

・・・・・・・・

let manager: PHImageManager = PHImageManager()
manager.requestImageForAsset(asset,
    targetSize: CGSizeMake(70, 70),
    contentMode: .AspectFill,
    options: nil) { (image, info) -> Void in
        imageView.image = image
    }

[修正]

class PhotoViewController : UIViewController,UICollectionViewDataSource, UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{


    var dataArray :[String] = []

   // var key : String = ""
   // var value2 :String  = ""

    var photosImg:[UIImage] = []
    var cellImage:UIImage?

    override func viewDidLoad() {
        super.viewDidLoad()

        var albumName = "MyCollection"
        var assetCollection = PHAssetCollection()
        var albumFound = Bool()
        var photoAssets = PHFetchResult<AnyObject>()
        let fetchOptions = PHFetchOptions()

        fetchOptions.predicate = NSPredicate(format: "title = %@", albumName)
        let collection:PHFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

        if let first_Obj:AnyObject = collection.firstObject{

            assetCollection = collection.firstObject as! PHAssetCollection
            albumFound = true
            print("アルバムみつかった")
        }else {
            albumFound = false
            print("アルバムみつからない")
        }

        var i = collection.count
        photoAssets = PHAsset.fetchAssets(in: assetCollection, options: nil) as! PHFetchResult<AnyObject>
        let imageManager = PHCachingImageManager()

        photoAssets.enumerateObjects({(object: AnyObject!,
            count: Int,
            stop: UnsafeMutablePointer<ObjCBool>) in

            if object is PHAsset{
                let asset = object as! PHAsset

                let imageSize = CGSize(width: asset.pixelWidth,
                                       height: asset.pixelHeight)

                let options = PHImageRequestOptions()
                options.deliveryMode = .fastFormat
                options.isSynchronous = true

                imageManager.requestImage(
                    for: asset,
                    targetSize: imageSize,
                    contentMode: .aspectFill,
                    options: options,
                    resultHandler: {(image, info) -> Void in
                     //CollectionView用に配列に入れる!   
                    self.photosImg = [image!]

                    }
                )

            }

        })

    }



    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{

        // Cell はストーリーボードで設定したセルのID
        let testCell:UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)

        // Tag番号を使ってImageViewのインスタンス生成
        let imageView = testCell.contentView.viewWithTag(1) as! UIImageView

        // 画像配列の番号で指定された要素の名前の画像をUIImageとする
        //cellImage = UIImage(named: photosImg[(indexPath as NSIndexPath).row])
        cellImage = photosImg[(indexPath as NSIndexPath).row]

        // UIImageをUIImageViewのimageとして設定
        imageView.image = cellImage

        // Tag番号を使ってLabelのインスタンス生成
        let label = testCell.contentView.viewWithTag(2) as! UILabel
        label.text = "a"


        return testCell
    }
    func numberOfSections(in collectionView: UICollectionView) -> Int {

        // section数は1つ
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // 要素数を入れる、要素以上の数字を入れると表示でエラーとなる
        return photosImg.count;

    }
    // Screenサイズに応じたセルサイズを返す
    // UICollectionViewDelegateFlowLayoutの設定が必要
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let cellSize:CGFloat = self.view.frame.size.width/2-2
        // 正方形で返すためにwidth,heightを同じにする
        return CGSize(width: cellSize, height: cellSize)
    }

補足情報(言語/FW/ツール等のバージョンなど)

Xcode 8.3
swift 3.1

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2017/07/03 14:24

    途中で質問内容を変えないで下さい。(今回はこのままでいいですが)で、photosImg.countは3になっているのでしょうか?

    キャンセル

  • wakuwakuWTP

    2017/07/03 14:34

    すみません。photosImg.countは1になってしまいます。

    キャンセル

  • fuzzball

    2017/07/03 14:49

    じゃあCollectionViewは関係ないですよね。なぜ話をややこしくするのか‥。

    キャンセル

回答 2

+1

至急ということなのでとりあえず。
(iOS8.1)PhotoKitで各種アルバムを取得する

参考になれば。

【追記】

let collections = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumRegular, options: nil)
collections.enumerateObjects { (collection: PHAssetCollection, index: Int, stop) in
    print(index, collection)
    if collection.localizedTitle == "hoge" { //アルバム名
        let assets = PHAsset.fetchAssets(in: collection, options: nil)
        assets.enumerateObjects({ (asset, index, stop) in
            print(index, asset)
        })
        //stop.pointee = true //同じ名前のアルバムが複数存在出来るようなのでstopしない
    } else {
        print(index, "skip")
    }
}

PHFetchOptionsを使ったら、もう少し効率良く出来るかもしれませんが。

 質問編集後の回答

self.photosImg = [image!]

上書きになっているので、追加にして下さい。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/07/03 10:33

    参考となるサイトをありがとうございます。自分でも調べている際に、こちらのサイトを何度か拝見したのですが初心者の自分ではどのようにプログラミングしたらよいかわかりませんでした・・・。

    キャンセル

  • 2017/07/03 13:10

    参考コードを追記しました。

    キャンセル

  • 2017/07/03 14:20

    大変失礼いたしました。追記いたしました。

    キャンセル

  • 2017/07/03 14:53

    回答に追記しました。

    キャンセル

check解決した方法

0

>self.photosImg = [image!]
>上書きになっているので、追加にして下さい。

気づきませんでした。
こちらを以下に修正したらうまくいきました。ありがとうございます。
self.photosImg.append(image!)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Swift

    8182questions

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

  • Xcode

    4614questions

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

  • iOS

    4382questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。