SwiftでUICollectionViewCellに写真を表示させる方法

このQ&Aのポイント
  • カメラロールの写真をSwiftのUICollectionViewCellに読み込んで表示させる方法を教えてください。
  • 写真をタッチしたときに、その写真のURLを取得し、配列に格納する方法を教えてください。
  • UICollectionViewCellのdidSelectItemAtIndexPathメソッド内で、写真をタッチしたときの処理についても教えてください。
回答を見る
  • ベストアンサー

Swiftについて教えてください

カメラロールにある写真をUICollectionViewCellに読み込んで表示させ、その写真をタッチしたときに、その写真のURL(保存されているカメラロールまでのパス?)を取得し、配列に格納しようと考えています。 「ALassetslibrary url 取得」というキーワードなどで調べてみたのですが、Objective-Cで書かれたものやimagePickerControllerを使ったもがほとんどでで、よくわかりませんでした。 http://tryworks-design.com/?p=2282 http://tech.camph.net/%E3%80%90ios%E3%80%91iphone%E3%81%AE%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8Bassetslibrary%E3%81%AB%E3%81%A4%E3%81%84/ ライブラリ内でのURL  [[asset defaultRepresentation] url] //AssetURL(NSURL*型) Swiftでの情報で http://qiita.com/BOPsemi/items/9a0338635647cd34c910 があったので、var library = ALAssetsLibrary()とし、 libraryのassetForURLというメソッドを使うのかなど調べてみたのですがよく分かりませんでした。 UICollectionViewCellに読み込んで表示させ、その写真をタッチしたときの func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { } の中でどのような処理をすれば良いのでしょうか?教えてください。よろしくお願いします。

  • dkong
  • お礼率86% (170/197)
  • Swift
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> URL(保存されているカメラロールまでのパス?)を取得し、配列に格納しようと考えています。 前回の http://bekkoame.okwave.jp/qa9098020.html の質問でassetsにALAssetオブジェクトの配列を取得できていますから、 カメラロールの画像を扱いたいなら、そのALAssetを使えばよいはずです。 なので、なぜURLを配列に格納したいのかわかりませんが、 どうしてもURLを取得したいなら、今回の質問にも書かれている [[asset defaultRepresentation] url] をswiftに変換して asset.defaultRepresentation().url() とすればよいです。 ちなみに、これで得られるURLは一般的な 「http://~」や「file://~」のスキームでなく 「assets-library://~」というスキームで表現されているため、 このURLを指定してカメラロールの画像を使用するには 結局AssetLibraryを使ってALAssetオブジェクトを得る必要があります。 このURLを指定してALAssetオブジェクトを得るメソッドが、 質問にも書かれている「assetForURL」ですが、面倒な非同期ブロックを 記述して取得する必要があります。そうすると、また前回の質問のような 取得タイミングの問題が出てきます。 なので、ALAssetオブジェクトを取得できているなら、わざわざURLに変換して 格納しなくても、ALAssetオブジェクトをそのまま使った方が簡単です。 AssetLibraryのURLを保存する必要があるケースは、 指定されたカメラロールの画像をアプリ再起動後も再読み込みして 表示する(このためにAssetLibraryのURLを外部のファイルやサーバーに 保存する)ケースくらいじゃないかなと思います。

dkong
質問者

お礼

回答ありがとうございます。urlばかり考えていたのですが、取得しているassetを使うことで、やりたかったことが、スムーズにできました。ありがとうございました。

関連するQ&A

  • Swiftについて教えてください

    カメラロールにある写真をUICollectionViewに読み込み表示させようと思い、いろいろ調べながら下記のようにしてみたのですが、表示されません。swiftでALAssetをUICollectionViewで表示させるなどのやり方を調べてみたのですが、わかりませんでした。(英語のサイトなどにあったかもしれませんが…)swiftでALAssetをUICollectionViewで表示させかた教えてください。 import UIKit import AssetsLibrary class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { var assets : NSMutableArray = [] var groups = ALAssetsGroup() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.groups.enumerateAssetsUsingBlock({ (asset: ALAsset!, index: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Void in if asset != nil { self.assets.insertObject(asset!, atIndex: 0) } }) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.assets.count; } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)as! UICollectionViewCell let asset :ALAsset = self.assets[indexPath.item] as! ALAsset; (cell.viewWithTag(1) as! UIImageView).image = UIImage(CGImage: asset.thumbnail().takeUnretainedValue()) return cell }

    • ベストアンサー
    • Swift
  • Swiftについて教えてください

    UICollectionViewのUICollectionViewCellに読み込んで表示した写真をタッチし、その写真に枠をつけようと思い、下記のようにしたのですが、枠が表示されません。タッチした写真に枠を付けるにはどのようにすればいいのでしょうか?教えてください。 func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { //print("touch") var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath)as! UICollectionViewCell //print(cell) cell.contentView.layer.borderColor = UIColor.redColor().CGColor cell.contentView.layer.borderWidth = 5.0 }

    • ベストアンサー
    • Swift
  • Swiftについて教えてください

    カメラロールの写真を取得する下記の関数を作ってみたのですが、写真が90度回転されて読み込まれてしまうので、 http://blog.kitoko552.com/entry/20151213/1450008748 http://yutakaseda3216.hatenablog.com/entry/2016/01/14/132300 http://qiita.com/FGtatsuro/items/57be765cba2bf576a8d9 http://ameblo.jp/ladycosmos/entry-11789597326.html などを調べてみたのですが解決できませんでした。 UIImage(CGImage:   ,scale:      ,orientation:     )の引数などがよく分かっていません。また、aseetから向きやサイズの取得の仕方など教えてください。よろしくお願いします。 aseetArrayはaseetを読み込んだ配列です。 func getUIImage(index :Int)->UIImage { let asset:ALAsset = aseetArray[index] as! ALAsset; var assetRep: ALAssetRepresentation = asset.defaultRepresentation() var iref = assetRep.fullResolutionImage().takeUnretainedValue() var image = UIImage(CGImage:     ,scale:     ,orientation:      )   return image! }

    • ベストアンサー
    • Swift
  • Swiftについて教えてください

    UICollectionviewに読み込んだ画像をタッチして枠線と番号を表示させようと下記のようにしてみたのですが、最後のセルにだけラベルの番号が表示されます。(枠を消したら数字も減ります)各セルにはラベルはきちんと配置されています。それをnumLabel.hidden = trueで消しておいて、セルをタッチした時にnumLabel.hidden = falseで表示させようとし考えています。なぜ最後のセルだけなのでしょうか。教えてください。よろしくお願いします。 import UIKit class ViewController: UIViewController ,UICollectionViewDataSource, UICollectionViewDelegate{ //画像を格納する配列 var imageArray:[UIImage] = [] //番号ラベル let numLabel: UILabel = UILabel(frame: CGRectMake(0,0,30,30)) //選択したIndexPath格納する配列 var selection: [NSIndexPath] = [] //コレクションビュー @ IBOutlet weak var imageCollection:UICollectionView? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. //配列imageArrayに1~6.pngの画像データを格納 for i in 1...6{ imageArray.append(UIImage(named: "\(i).png")!) } } //コレクションビューのアイテム数を設定 func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { //戻り値にimageArrayの要素数を設定 return imageArray.count } //コレクションビューのセルを設定 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { //繰り返し使用することができるUICollectionViewCellのインスタンスを作成 var cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! UICollectionViewCell //セルのなかの画像を表示するImageViewのタグを指定 let imageView = cell.viewWithTag(1) as! UIImageView //セルの中のImage Viewに配列の中の画像データを表示 imageView.image = imageArray[indexPath.row]   //ラベルの設定 // 背景を青色にする. numLabel.backgroundColor = UIColor.blueColor() // 文字の色を白にする. numLabel.textColor = UIColor.whiteColor() //文字サイズ numLabel.font = UIFont.systemFontOfSize(12); // Textを中央寄せにする. numLabel.textAlignment = NSTextAlignment.Center //ラベルを非表示にする numLabel.hidden = true //セルにラベルを配置 cell.addSubview(numLabel) //設定したセルを戻り値にする return cell } //セルをタップしたとき func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { let cell = collectionView.cellForItemAtIndexPath(indexPath)! if let index = find(selection, indexPath) { selection.removeAtIndex(index) } else { selection.append(indexPath) } // 可視状態のセルを全て更新する collectionView.visibleCells().map({(cell: AnyObject) -> Void in self.updateCell(cell as! UICollectionViewCell) }) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //セルの更新 func updateCell(cell: UICollectionViewCell) { if let indexPath = self.imageCollection?.indexPathForCell(cell){ if let index = find(selection, indexPath) { cell.contentView.layer.borderColor = UIColor.blueColor().CGColor cell.contentView.layer.borderWidth = 4.0 numLabel.hidden = false numLabel.text = "\(index+1)" } else { cell.contentView.layer.borderColor = UIColor.clearColor().CGColor cell.contentView.layer.borderWidth = 0.0 numLabel.hidden = true } } } }

    • ベストアンサー
    • Swift
  • マナル隊というユーチューバーを知っていますか?

    マナル隊というユーチューバーを知っていますか? 1.知っている 2.知らない 僕は、1の「知っている」です。 皆さんは、マナル隊というユーチューバーを知っていますか? ↓URL https://youtube.com/c/MANARUTAI%E3%83%9E%E3%83%8A%E3%83%AB%E9%9A%8A

  • iphoneのフォトライブラリからカメラロールへ

    iphoneのフォトライブラリからカメラロールへ写真を移動させることって可能ですか?

  • iPhone4のカメラロール。

    iPhone4を使っています。 最近 写真をたくさん撮っていて 昨日カメラロールがいっぱい(1700枚くらい)になり 写真を撮ろうとすると 撮れなくて削除するよう 表示されました。 要らない写真は削除をし あとはiフォトアルバムとゆうアプリをダウンロードし、カメラロールから移し、カメラロールにある写真を削除していたところ…勝手に ライブラリをアップデート中…となりしばらく待ち 終わって カメラロールを見てみると写真が430枚に…(>_<)かなり減ってしまいました。バックアップしてなかった為 慌てて 電源を入れ直して見ても変わらず…。カメラロールを見ると 割と古い写真は残っていたのですが 途中…ごっそりとなくなっていたり 新しい写真は どうゆう訳かランダムになくなっています。 これは一体どうゆう事なんでしょう? 大切な写真があるので どうにか元に戻したいのですが…。 同じような事があった方や 元に戻す方法 知ってる方いらっしゃいましたら教えてください! パソコンに関してほとんど無知なので 詳しく教えていただきたいです。 お願いします。

  • xcodeでiosアプリ開発の基本中の基礎

    表題の件ですが、 この度iosアプリ開発でxcode4.6を使用していますが 使い方がチンプンカンプン状態です やりたいことは以下の通りです  ・起動したら指定したURLをSafariで開くようにする .  ・画像やボタンは一切使用しない わからない事は以下の通りです  ・プロジェクト作成時7種類の選択があるのですがどれを選択すればいいのでしょうか?  ・実行コードはどこに記述すればいいのでしょうか? ソースは以下のurl http://blog.earthyworld.com/archives/ios%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%9F%E3%82%89%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9Furl%E3%82%92safari%E3%81%A7%E9%96%8B%E3%81%8F%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B-nsurl/ を参考にできるのですが 肝心なプロジェクト作成方法とソース記述方法がわからず 手詰まり状態です どうかご回答宜しくお願いします。

    • 締切済み
    • Mac
  • 鉄道写真・走行音などを売りたいです。お勧めのサイトはありませんか?

    今「フォトライブラリー」http://www.photolibrary.jp/に写真を何枚かアップしていますが。 やはり鉄道写真(芸術写真)は売れないのでしょうか? ヤフーオークションでは鉄道写真の出品があるみたいですが…。 http://list5.auctions.yahoo.co.jp/jp/%e9%89%84%e9%81%93-%e8%8a%b8%e8%a1%93%e5%86%99%e7%9c%9f-%e7%be%8e%e8%a1%93%e5%93%81-%e3%83%9b%e3%83%93%e3%83%bc-%e3%82%ab%e3%83%ab%e3%83%81%e3%83%a3%e3%83%bc/2084007687-category-leaf.html こちらにも出そうかと思っています。 またお勧めの出品サイトがあれば教えてください。 主に鉄道写真を販売してあとは風景等も売りたいと思っていますが…。 出品形態は、デジタルデータ渡しで2次利用は不可にしたいです。 あと、走行音とかも販売したいです。 よろしくお願いします。

  • 既に基台がある防犯カメラをフィクサーに付ける方法

    1/4インチが付いているカメラフィクサーに防犯カメラを取り付けたいのですが、画像のようにカメラに既に取付け基台が付いています。 このようなカメラをフィクサーに取り付けるとしたらどのようにしますか? 何か良い案あれば教えてください。 https://www.amazon.co.jp/%E3%83%88%E3%82%AD%E3%83%8A%E3%83%BC-WH-31-%E9%98%B2%E7%8A%AF%E3%82%AB%E3%83%A1%E3%83%A9-%E5%8F%96%E3%82%8A%E4%BB%98%E3%81%91%E9%87%91%E5%85%B7/dp/B004EA2L8Q/ref=sr_1_3?ie=UTF8&qid=1530673887&sr=8-3&keywords=%E3%82%AB%E3%83%A1%E3%83%A9%E3%83%95%E3%82%A3%E3%82%AF%E3%82%B5%E3%83%BC http://akizukidenshi.com/catalog/g/gM-10217/

専門家に質問してみよう