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

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

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

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

Swift

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

Q&A

1回答

4062閲覧

[Swift]xibに切り出したtableViewHeaderの高さを可変にしたい

oyasumi

総合スコア13

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/10/23 05:12

編集2018/10/23 07:26

前提・実現したいこと

tableViewをつかってアコーディオンメニューを作成しています。
tableViewHeader内のlabelの文字が増えるのに合わせて高さを可変にするのに詰まっています。
tableViewHeaderはxibファイルに切り出しています。

tableViewはViewControllerにおいてありHeaderの高さはコード内の

Swift

1 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 2 return 70 3 }

で指定しないとlabelが表示さませんでしたが、この関数が呼ばれるタイミングが早すぎるため、
xibが生成されてlabelの文字が当てこまれた後の高さを代入することもできませんでした。
またestimatedSectionHeaderHeightで高さを仮置きして、xib生成後に上書きするという方法も考えたのですが
estimatedSectionHeaderHeightが無視されてうまくいきませんでした。

どうしたらxibの高さをtableViewに反映できるのでしょうか。。

補足情報(FW/ツールのバージョンなど)

XCode 9.4.1
Swift 4.1.2

header(xib)

イメージ説明

header(swiftファイル)

Swift

1import Foundation 2import UIKit 3//TODO: トグルのIconはスクショで代用してるだけなので変更が必要 4 5class QAHeaderView: CustomViewBase{ 6 7 @IBOutlet weak var questionLabel: UILabel! 8 @IBOutlet weak var toggleImage: UIImageView! 9// @IBOutlet weak var topAllgnmentConstraint: NSLayoutConstraint! 10// @IBOutlet weak var bottomAllgnmentConstraint: NSLayoutConstraint! 11 @IBOutlet weak var borderHeightConstraint: NSLayoutConstraint! 12 13 // MARK: - Initializer 14 required init(frame: CGRect) { 15 super.init(frame: frame) 16 setupEventHeaderView() 17 } 18 let parentsVC = QAViewController() 19 required init?(coder aDecoder: NSCoder) { 20 super.init(coder: aDecoder) 21 setupEventHeaderView() 22 } 23 24 // MARK: - Function 25 //ここでlabelにtext代入 26 func setHeader(_ qa: QA) { 27// topAllgnmentConstraint.constant = parentsVC.screenSize.height * 0.0284 28// bottomAllgnmentConstraint.constant = parentsVC.screenSize.height * 0.0284 29 questionLabel.text = qa.question 30 } 31 //ここでAnswerが開かれてるか判断 32 //アイコンは開閉に合わせて角度を変更 33 func shouldExtended(_ result: Bool) { 34 var rotationEnd: CGFloat 35 if result { 36 rotationEnd = 180.0 37 borderHeightConstraint.constant = 0 38 } else { 39 rotationEnd = 0.0 40 borderHeightConstraint.constant = 1 41 } 42 UIView.animate(withDuration: 0.16, animations: { 43 self.toggleImage.transform = CGAffineTransform(rotationAngle: (rotationEnd * CGFloat(Double.pi)) / 180.0) 44 }) 45 } 46 47 // MARK: - Private Function 48 private func setupEventHeaderView() { 49 toggleImage.backgroundColor = UIColor.white 50 toggleImage.transform = CGAffineTransform(rotationAngle: (0.0 * CGFloat(Double.pi)) / 180.0) 51 } 52} 53

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

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

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

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

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

fuzzball

2018/10/23 05:24

セル内の配置にAutolayoutは使っていないのでしょうか?
oyasumi

2018/10/23 05:29

使用しています。なのでviewDidLayoutSubviews()内でtableView.sectionHeaderHeightを上書きしようと試みたりはしました。
fuzzball

2018/10/23 05:35

使っていれば何もしなくても可変になると思うのですが。tableView(_:heightForHeaderInSection:)を削除してもダメでしょうか?ダメならどのような制約を付けているか書いて下さい。(「で指定しないとlabelが表示さませんでしたが」と書いてあるので、そもそも何かおかしいような気はしますが)
oyasumi

2018/10/23 05:48

削除するとheaderの高さがtoggleImageの高さになりlabelの高さがなくなりました。
fuzzball

2018/10/23 05:57

これはセルに乗せるViewのAutolayoutであって、セルのAutolayoutではないですよね?
oyasumi

2018/10/23 07:37

すみません。cellと書いてしまったのですがHeaderでした。なるほどです。Headerに対してのAutolayoutはかけていないです。高さを可変にすることとイマイチ結びつかないのですがどういうことでしょうか。
fuzzball

2018/10/23 07:54

あー、すみません。思いっきり勘違いしていました。セルじゃなくてヘッダですね。
fuzzball

2018/10/23 09:52

tableView(_:heightForHeaderInSection:)の中で、実際にヘッダを生成して高さを返すという方法ではダメでしょうか?あと(使ったことはないですが)UITableViewHeaderFooterViewを使うと、セルと同じように高さ可変になるかも知れません。
guest

回答1

0

swift

1self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;

これは試してみましたか?

もしくは

swift

1func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 2 return UITableViewAutomaticDimension 3}

ところで、UITableViewにはUITableViewのHeader/Footerと、SectionについてるHeadr/Footerがあります
UITableViewのHeaderというと前者になると思います
これは
tableView.headerViewでアクセスできるものです

投稿2018/10/26 12:20

編集2018/10/26 12:27
kosanai

総合スコア471

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

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

oyasumi

2018/10/30 05:00

回答ありがとうございます。ですが後から代入する文字列が認識されずどちらもうまくいきませんでした。
kosanai

2018/10/30 09:08 編集

後から代入する場合はアップデートが必要だと思いますが setHeaderはreloadDataなどをトリガーにして呼ばれている感じですか? もし何らかの方法でsectionHeaderだけを取り出して、中身を書き換えているなら高さが変わらないと思います (layoutIfNeededでupdateされるかもしれませんが、headerのみupdateできるかちょっとまだ自信がないです。tableView.reloadSectionsが妥当かもしれません)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問