人生の恥は書き捨て

プログラムとかいろいろ

UICollectionViewを実装する[swift&xcode6]

今回やること

swift&xcode6という最新っぽい環境でUICollectionViewを実装します。

ゴールはこんな感じです。
f:id:kazuhei0108:20141126001216p:plain
f:id:kazuhei0108:20141126001229p:plain

タイル状に画像を並べ、並んだ画像をタップすると画像の詳細画面に移動するというものです。
また移動後は画面上部のBackから元の一覧に戻ることが出来ます。

作り方は、こちらの動画を参考にさせていただきました。

UICollectionView. Swift, Xcode 6 - YouTube

手順

ストーリーボードで

  • Navigation Controller で 画面上部の < Backを作成
  • UICollectionView でタイル表示を作成
  • 詳細画面の作成
  • タイルと詳細画面をリンク

プログラム側で

  • UICollectionViewとControllerのヒモ付
  • タイル表示のタイルとUICollectionViewCellのヒモ付
  • 詳細画面とControllerのヒモ付

実装

最初はやること全部書こうかと思ったんですが、
上の動画が素晴らしすぎる&ストーリーボードの説明しんどいので、
コードだけ載せて置きます。

基本的に動画を見ていただければということで。


一枚目のタイル表示のViewController

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    var arr:[String] = []
    var name: AnyObject? {
        get {
            return NSUserDefaults.standardUserDefaults().objectForKey("name")
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(newValue!, forKey: "name")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        for (var i = 1; i <= 30; i++) {
            arr.append(String(i) + ".jpeg")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return arr.count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        var cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as myViewCell
        cell.imgView.image = UIImage(named: arr[indexPath.row])
        return cell
    }
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        name = arr[indexPath.row]
    }
}

UICollectionViewを使うために、UICollectionViewDataSource, UICollectionViewDelegateを継承しています。

今回のサンプルでは値の受け渡しにuserDefaultを利用しています。
処理の内容としては、arrに画像のパスを格納、


CollectionViewのCellそれぞれに画像を詰めていきます。

そしてタイルが選択された場合は、nameというキーでuserDefaultに選ばれた画像パスを渡しています。


2枚目の詳細画面のViewController

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var newImgView: UIImageView!
    var name: AnyObject? {
        get {
            return NSUserDefaults.standardUserDefaults().objectForKey("name")
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        newImgView.image = UIImage(named: name as String)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

一枚目のViewControllerでuserDefaultに保存した画像パスを取り出して、UIImageを作って表示しています。

最後にCollectionViewのセル(タイル)のコード

import UIKit

class myViewCell: UICollectionViewCell {
    
    @IBOutlet weak var imgView: UIImageView!
}

InterfaceBuilderで貼り付けただけですが。