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

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

ただいまの
回答率

89.99%

CollectionViewのCellの見た目 位置,サイズなどを動的にしたい.

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,823

mashiroyuya

score 22

iPhoneアプリの作っている初心者なのですが CollectionViewのcellを5×6のcellからnavigation barの右あるボタンを押すとcellのサイズも変わって6×6になるというプログラムを作りたいです. この行数と列数はViewContorllerの方でメンバ変数として作ってあります

class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
    var myCollectionView : UICollectionView!
    var gyou:Int = 6
    var retu:Int = 5

override func viewDidLoad() {
        super.viewDidLoad()

        let width = self.view.bounds.width
        let height = self.view.bounds.height

        // CollectionViewのレイアウトを生成.
        let layout = UICollectionViewFlowLayout()
        layout.itemSize = CGSizeMake(width/(CGFloat(gyou)+1),height/CGFloat(retu)+1) //Cellの大きさ
        layout.sectionInset = UIEdgeInsetsMake(16, 0, 32, 0) // Viewの外枠 cellを表示しない余白のサイズ
        layout.headerReferenceSize = CGSizeMake(10,10) // セクション毎のヘッダーサイズ.
        layout.minimumInteritemSpacing = 1.0 //アイテム同士の余白
        layout.minimumLineSpacing = 2.0 //セクションとアイテムの余白

        // CollectionViewを生成.
        myCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)

        // Cellに使われるクラスを登録.
        myCollectionView.registerClass(CustomUICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell")

        self.view.addSubview(myCollectionView)

        myCollectionView.delegate = self
        myCollectionView.dataSource = self
}

それでボタンのアクションを

@IBAction func HennsyuButton(sender: AnyObject) {
        retu = 6
        myCollectionView.reloadData()
    }

としてreloadさせたいのですがこれではviewdidloadが呼ばれないので見た目が変わらず.なので 次は

/*
    Cellに値を設定する
    */
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let width = self.view.bounds.width
        let height = self.view.bounds.height
        let cell : CustomUICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! CustomUICollectionViewCell
        cell.frame.size = CGSizeMake(width/CGFloat(gyou)+1, height/CGFloat(retu)+1)
        cell.textLabel?.text = indexPath.row.description
        print("call here")
        return cell
    }

こうしたらloaddata()[ボタンを押すと]でcall here ってでてここが呼ばれたのがわかったのですがcellのサイズが小さくなるだけでcellの表示が6×6になりませんでした.

またcell.frameにCGRectMakeを使ってcellの位置を上のメソッドで変えてやってもサイズだけが変わるだけでcellの位置は変わりませんでした. ボタンなどで動的にCollectionCellViewの見た目,Cellのサイズ,レイアウトなどを変えることができるようにどのように実装すればよいでしょうか?

またなぜ上のメッソドの中でcellのサイズは変わってもcellの位置は変えられないのでしょうか.お教えお願いします.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

cellのサイズを変更してもcellの大きさが変わるだけなので、

let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSizeMake(width/(CGFloat(gyou)+1),height/CGFloat(retu)+1) //Cellの大きさ

このlayoutを変更しないとcellのlayoutを変更することはできません。

そのため、ボタンをタップしたら、layoutの変更を下記のように行ったら変更できます。

@IBAction func HennsyuButton(sender: AnyObject) {
        gyou = 6  //ここで変更したい値を入れます。
        let layout = UICollectionViewFlowLayout()
        layout.itemSize = CGSizeMake(width/(CGFloat(gyou)+1),height/CGFloat(retu)+1) //Cellの大きさ
        layout.sectionInset = UIEdgeInsetsMake(16, 0, 32, 0) // Viewの外枠 cellを表示しない余白のサイズ
        layout.headerReferenceSize = CGSizeMake(10,10) // セクション毎のヘッダーサイズ.
        layout.minimumInteritemSpacing = 1.0 //アイテム同士の余白
        layout.minimumLineSpacing = 2.0 //セクションとアイテムの余白

        myCollectionView.collectionViewLayout = layout //layoutの更新
        myCollectionView.reloadData  //これはいらないかもしれません
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/13 07:29

    回答ありがとうございます。
    ```Swift
    myCollectionView.collectionViewLayout = layout //layoutの更新
    ```
    のところで

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0})'
    ***

    というエラーが出てしまいます.このエラーはどういう意味でしょうかご教授お願いできますか?

    キャンセル

  • 2015/12/13 10:22

    http://xcodeprogirl.hatenablog.com/entry/2014/01/10/120035
    エラーの内容でぐぐるとこんな感じの記事が出てきますが、setObjectForKeyを使用しているわけではないですよね?
    エラー内容的にはnilが関連してそうな事はわかるのですが...
    エラーが出たときの画面全体のスクショとかいただけたらなにかわかるかもしれません。

    キャンセル

0

これで実現できるけど、質問を読み違えていたら、ごめんなさい。

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//        return 30
        return gyou * retu;
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/12/12 21:54

    回答ありがとうございます。そのコードはすでに実装してあって,5×6のcellを表示するのはできているのですがそれをボタンを押すことで6×6にするということをしたいのです。

    キャンセル

  • 2015/12/12 22:49

    最初に
    var gyou:Int = 6
    var retu:Int = 5
    と宣言して、
    gyou = 6
    なら何も変わらないぜ、兄貴 (T . T)
    私も
    gyou++
    と勝手に脳内で変換して打ったから、今まで気がつかなかったんですけどね。

    キャンセル

  • 2015/12/13 07:32

    むむ、、、
    すみません。gyou=6じゃ何もかわらないので retu=6に変更しました.

    キャンセル

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

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