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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

8150閲覧

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

mashiroyuya

総合スコア24

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

1クリップ

投稿2015/12/12 08:53

編集2015/12/12 22:31

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

swift

1class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 2 var myCollectionView : UICollectionView! 3 var gyou:Int = 6 4 var retu:Int = 5 5 6override func viewDidLoad() { 7 super.viewDidLoad() 8 9 let width = self.view.bounds.width 10 let height = self.view.bounds.height 11 12 // CollectionViewのレイアウトを生成. 13 let layout = UICollectionViewFlowLayout() 14 layout.itemSize = CGSizeMake(width/(CGFloat(gyou)+1),height/CGFloat(retu)+1) //Cellの大きさ 15 layout.sectionInset = UIEdgeInsetsMake(16, 0, 32, 0) // Viewの外枠 cellを表示しない余白のサイズ 16 layout.headerReferenceSize = CGSizeMake(10,10) // セクション毎のヘッダーサイズ. 17 layout.minimumInteritemSpacing = 1.0 //アイテム同士の余白 18 layout.minimumLineSpacing = 2.0 //セクションとアイテムの余白 19 20 // CollectionViewを生成. 21 myCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 22 23 // Cellに使われるクラスを登録. 24 myCollectionView.registerClass(CustomUICollectionViewCell.self, forCellWithReuseIdentifier: "MyCell") 25 26 self.view.addSubview(myCollectionView) 27 28 myCollectionView.delegate = self 29 myCollectionView.dataSource = self 30} 31 32

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

swift

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

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

swift

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

swift

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

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

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

swift

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

投稿2015/12/12 16:10

domonr

総合スコア263

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mashiroyuya

2015/12/12 22: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})' *** というエラーが出てしまいます.このエラーはどういう意味でしょうかご教授お願いできますか?
domonr

2015/12/13 01:22

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

0

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

swift

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

投稿2015/12/12 11:45

izkn

総合スコア1698

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mashiroyuya

2015/12/12 12:54

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

2015/12/12 13:49

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

2015/12/12 22:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問