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

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

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

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

Swift 2

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

Q&A

解決済

1回答

2621閲覧

Static Cellsで作成したTableViewのセルの高さを変更したい

M.minoru

総合スコア19

Xcode 7

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

Swift 2

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

0グッド

0クリップ

投稿2016/09/06 01:39

編集2016/09/07 02:46

現在storyboardを使いStaticCellsでTableViewを作っています。
StaticCellsではセルの追加や削除などができないということは調べてわかりました。(セルの数が変わる)

では高さの変更をすることはできないのでしょうか?
ちなみに下記のoverride funcではstoryboardの設定から高さを変更することができました。(変更ではなくこの値でTableを作っている?)

override func tableView(tableView: UITableView,heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{ return 30 }

このようなfunctionを作りアプリを操作している時にボタンやスイッチで高さを変えられないのでしょうか
似たような感じで下記のfunctionを作ってみましたが、関数の中には入ってはいるようですがCellの高さは変わりませんでした

func heightChanger(tableView: UITableView,heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{ print("関数") print(indexPath.row) if indexPath.section == 2 && indexPath.row >= 3 { print("if文内") return 30 } return 0 }

調べてみてもStatic Cellsを使っている例が少なくなかなか参考になるものが見つかりませんでした。

またもし高さ変更ができないのであればできないと回答が欲しいです。
宜しくお願いします。

追加のコード

import UIKit class ViewController: UITableViewController{ @IBOutlet var table: UITableView! var height: CGFloat = 0.0 var num = 0 override func viewDidLoad() { super.viewDidLoad() } override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { if num == 0{ if indexPath.section == 0 && indexPath.row == 4 { num += 1 return 0 } if indexPath.section == 0 && indexPath.row >= 1 { return 0 } else { if indexPath.section == 0 && indexPath.row == num { return 50 } } } if indexPath.section == 0 && indexPath.row >= num{ return 0 } return 50 } @IBAction func pushButton(sender: AnyObject) { num += 1 heightChanger() } func heightChanger() { if num <= 3{ table.reloadRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: num)], withRowAnimation: .Automatic) } else{ print(12345) } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

#1

heightChangerの中身をそのままheightForRowAtIndexPathに書いてみて下さい。(heightChangerは削除)
やりたいことと違う場合は、どのように違うか教えて下さい。

#2

特定のセル(2-3)だけ高さを変更するサンプル。
高さを変更した後にリロードしないと、すぐに(見た目に)反映されません。

swift

1class ViewController: UIViewController { 2 3 @IBOutlet var table: UITableView! //TableViewのOutlet(heightChangerの中で使用) 4 var height: CGFloat = 30.0 //高さを保存しておく変数 5 6 : 7 8 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 9 { 10 if indexPath.section == 2 && indexPath.row >= 3 { 11 //2-3のときだけ保存してある高さを返す 12 return height 13 } else { 14 return 30 15 } 16 } 17 18 func heightChanger() { 19 //高さを変えて 20 height += 10.0 21 //2-3だけリロード(再表示)する 22 table.reloadRowsAtIndexPaths([NSIndexPath(forRow: 2, inSection: 3)], withRowAnimation: .Automatic) 23 //これだとテーブル全体をリロードする 24 //table.reloadData() 25 } 26}

投稿2016/09/06 01:55

編集2016/09/06 07:58
fuzzball

総合スコア16731

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

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

M.minoru

2016/09/06 07:05

上のoverride func tableView〜の中にheightChangerの if~を書いてください、ということでしょうか? それですとページに移動した際に任意のセルの高さの変更になるのでやりたいことと違ってしまいます。 画面内でbuttonやswitchを押した時にセルの高さが変更(0から数値を大きくしてセルが増えたように見せたい)したいです。
fuzzball

2016/09/06 07:20

ボタンやスイッチを操作したときにheightChangerを呼び出して、呼び出したときにセルの高さを変更したい、ということでしょうか?
M.minoru

2016/09/06 07:27

はいそうです。 今の状態ですと print("if文内") の処理にはたどり着けるのですが高さが変わりません。
fuzzball

2016/09/06 07:59

回答に追記しました。UITableView/UITableViewCellについて、もう少し勉強したほうが良いと思います。(どういう処理の流れでセルが表示されるのか、など)
M.minoru

2016/09/07 03:54

回答を参考に書いたコードを質問に追加しました 回答のコードを使うと「StaticCellsはUITableViewControllerでないと使えません」のようなエラーが出たのでUITableViewControllerを使いました storyboardでセルが5つのセクションを作り、セルの中はそれぞれ文字の入ったラベルを一つと、一番上のセル(section0のrow0)のみボタンを配置しています。 初期表示では一番上のセル以外の高さを0にして見えなくしています。ボタンを押すことでセルの高さを変更することはできました。しかしボタンを押すと2番目以降のセルが順番に出るようにしたいのですが3番目のセルを表示させようとボタンをもう一度押すと、Thread 1 : signal SIGABRT、のエラーが出てしましました。 2番目のセルの表示はできますし、rowの数値がオーバーフローしているわけでもないですしどうなっているのでしょうか
fuzzball

2016/09/07 04:24 編集

まず、UITableViewControllerの件はすみません。普段はViewController+UITableViewなのですが、今回はテストということでUITableViewControllerを使っていました。 heightChanger()で、reloadRowsAtIndexPathsに渡しているindexPathのrowとsectionが逆ではないでしょうか? また、今回落ちている原因ではないですが、heightForRowAtIndexPathが呼ばれるタイミングを勘違いしているのではないかと思います。頭に、print(indexPath.row, num)などを追加して、呼ばれるタイミングを確認してみて下さい。 (おまけ) UITableViewControllerを使うときは、UITableViewのOutletを作る必要はありません。UITableViewには self.tableView でアクセスします。
M.minoru

2016/09/07 07:22

ありがとうございます。 あそこのrowとsectionが逆だったんですね。無事に解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問