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

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

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

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

Swift

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

Q&A

1回答

5492閲覧

【iOS】動的にHeightが変化するCustom cellの実装方法

Kesth

総合スコア83

iOS

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

Swift

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

0グッド

0クリップ

投稿2015/08/05 05:50

投稿失礼します。
iOSアプリの開発をSwiftを使って進めている者です。
今回はタイトルの件につき、CollectionviewのCustom CellのHeightを動的に可変にする方法を教えていただきたく、質問させていただきます。

例えばPinterestのUIをイメージしていただければ一発でわかると思いますが、Custom Cell内の動的にHeightが変化する要素によってCustom CellのHeightも動的に変化させるようなプログラムを実装したいと考えています。(widthは固定します)

私の方で、下記のレイアウトのCollectionviewの Custom cellを作成しています。

【Custom cell構成図】
※要素のwidthは固定し、heightのみ可変/固定としたい。

UILabel①(可変)
UILabel②(可変)
UIImage①(固定)
UIView①(可変。下記の要素を内包する)
UILabel③(可変)
UIView②(固定。下記の要素を内包する)
UIImage②(固定)
UILabel④(固定)
UIView③(固定)

上記のレイアウトに基づき、ユーザーの入力によってCollectionviewの各cellのHeightを動的に変化させる場合、どのようなプログラムを書けばよろしいでしょうか?
自分でも下記のように全ての要素の高さを加算させた変数を取得してreturnで値を返してみましたが、うまくいきませんでした。

let cellHeight = self.label.layer.bounds.height + ……

何卒ご教授のほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

UICollectionViewLayoutのサブクラスを作って、Cellのサイズをカスタマイズしてください。

サンプルコード

Swift

1import UIKit 2 3class CollectionViewLayout: UICollectionViewLayout { 4 5 override func collectionViewContentSize() -> CGSize { 6 let width = self.collectionView!.bounds.width 7 let numOfItems = self.collectionView!.numberOfItemsInSection(0) 8 let lastAttribute = layoutAttributesForItemAtIndexPath(NSIndexPath(forRow: numOfItems-1, inSection: 0)) 9 let height = lastAttribute!.frame.maxY + 20 10 return CGSizeMake(width, height) 11 } 12 13 override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? { 14 let numOfItems = self.collectionView!.numberOfItemsInSection(0) 15 return (0..<numOfItems).map { 16 self.layoutAttributesForItemAtIndexPath(NSIndexPath(forRow: $0, inSection: 0))! 17 } 18 } 19 20 override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? { 21 let attribute = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath) 22 let contentWidth = self.collectionView!.bounds.width 23 let row = CGFloat(indexPath.row) 24 let x:CGFloat = 20.0 25 let y:CGFloat = row * (row * 20.0 + 40.0) + 20.0 26 let width:CGFloat = contentWidth - 40.0 27 let height:CGFloat = row * 40.0 + 40.0 28 attribute.frame = CGRectMake(x, y, width, height) 29 return attribute 30 } 31}

投稿2015/08/05 12:44

編集2015/08/05 16:05
Stripe

総合スコア2183

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

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

Kesth

2015/08/05 14:30

コメントありがとうございます! すみません、実際のコード例などを用いてもう少し解説いただけると大変助かります! 初心者なもので、お手数お掛けします。
Stripe

2015/08/05 16:06

UICollectionViewLayoutのサンプルコードを追加しました。
Kesth

2015/08/06 09:36

サンプルコードありがとうございます! Storyboardを使わずコードだけで開発を行っておりますが、通常通りCustom cellを加えたCollectionviewControllerを作成した上で、いただいたコードを追記すればよろしいでしょうか? 下記のようなイメージです。 import UIKit class TestColle : UI〜 { //割愛 } //CollectonViewに必要なfuncなども割愛 いただいたコード
Stripe

2015/08/06 12:05

追記するだけでなく、ちゃんとUICollectionViewにセットしてください。 また、それはあくまでUICollectionViewLayoutのサンプルなので、あなたの要件に合うように修正してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問