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

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

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

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

Swift 2

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

Q&A

解決済

3回答

4667閲覧

一度代入したtableFooterViewの高さを0にしたい

Y_M

総合スコア265

Swift

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

Swift 2

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

0グッド

0クリップ

投稿2016/08/05 08:58

編集2016/08/08 01:35

###前提・実現したいこと
・cellの個数が10個以上ある場合にtableFooterViewを表示しない <-- hidden = falseで非表示には出来る
・cellの個数が10個以上ある場合にtableFooterViewの高さを0にしたい

###発生している問題・エラーメッセージ

EXC_BAD_ACCESS (code=2,address=0x16fc7ffe0)

###該当のソースコード

Swift

1class ViewController: UIViewController, UITableViewDataSource { 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 5 myTable.tableFooterView = UIView() 6 7 let window = UIScreen.mainScreen().bounds.size 8 let myImage = UIImage(named: "footer") 9 let myImageView = UIImageView(frame: CGRectMake(0, 0, window.width, (myImage?.size.height)!)) 10 11 myImageView.image = myImage 12 myImageView.contentMode = .ScaleAspectFill 13 myTable.tableFooterView = myImageView 14 15 } 16 17 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 18 19 if article.count >= 10 { 20 let window = UIScreen.mainScreen().bounds.size 21 let myImageView = UIImageView(frame: CGRectMake(0, 0, window.width, 0)) 22 tableView.tableFooterView = nil 23 tableView.tableFooterView = myImageView 24 } 25 return article.count 26 27 } 28}

###試したこと
10個以上の場合にtableFooterViewに一旦nilを代入し、
新しいUIImageViewの高さが0のものを代入している。

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode7.3.1
Swift2

###追記(ご回答を実装後)

Swift

1class ViewController: UIViewController, UITableViewDataSource { 2 3 @IBOutlet weak var myTable: UITableView! 4 5 var cnt = 15 6 var myImageView: UIImageView? 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10// let window = UIScreen.mainScreen().bounds.size 11// let myImage = UIImage(named: "footer") 12// myImageView = UIImageView(frame: CGRectMake(0, 0, window.width, (myImage?.size.height)!)) 13// 14// myImageView!.image = myImage 15// myImageView!.contentMode = .ScaleAspectFill 16// myTable.tableFooterView = myImageView 17 } 18 19 override func viewWillAppear(animated: Bool) { 20// if cnt >= 10 { 21// myImageView?.hidden = true 22// myImageView = UIImageView(frame: CGRectMake(0,0,0,0)) 23// myTable.tableFooterView?.frame.size.height = 0.0 24// } 25 myTable.reloadData() 26 super.viewWillAppear(animated) 27 } 28 29 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 30 return cnt 31 } 32 33 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 34 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 35 let label = cell.viewWithTag(1) as! UILabel 36 label.text = "\(indexPath.row + 1)" 37 return cell 38 } 39 40}

スクショスクショ
※左が該当部分をコメントアウト、右がコメントアウトなし(Footer追加時、本来はこのスペースに画像あり)

基本的にはFooterを追加しておいて、ある条件下にのみ、左のように詰めて表示したいのですが。。。

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

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

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

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

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

guest

回答3

0

自己解決

Swift

1class ViewController: UIViewController, UITableViewDataSource { 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 5 myTable.tableFooterView = UIView() 6 7 let window = UIScreen.mainScreen().bounds.size 8 let myImage = UIImage(named: "footer") 9 let myImageView = UIImageView(frame: CGRectMake(0, 0, window.width, (myImage?.size.height)!)) 10 11 myImageView.image = myImage 12 myImageView.contentMode = .ScaleAspectFill 13 14 } 15 16 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 17 18 return article.count 19 20 } 21 22 func getData() { 23 24 Alamofire 〜省略〜 25 26 if articles.count > 10 { 27 myTable.tableFooterView = myImageView 28 } else { 29 myTable.tableFooterView = nil 30 } 31 myTable.reloadData() 32 33 } 34 35}

投稿2016/08/08 04:08

Y_M

総合スコア265

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

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

0

Swift

1class ViewController: UIViewController, UITableViewDataSource { 2 3 @IBOutlet weak var myTable: UITableView! 4 5 var cnt = 15 6 var myImageView: UIImageView? 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 let window = UIScreen.mainScreen().bounds.size 11 let myImage = UIImage(named: "footer") 12 myImageView = UIImageView(frame: CGRectMake(0, 0, window.width, (myImage?.size.height)!)) 13 14 myImageView!.image = myImage 15 myImageView!.contentMode = .ScaleAspectFill 16 myTable.tableFooterView = myImageView 17 } 18 19 override func viewWillAppear(animated: Bool) { 20 if cnt >= 10 { 21 myImageView?.hidden = true 22 myImageView = UIImageView(frame: CGRectZero) 23 myTable.tableFooterView? = myImageView! 24 } 25 myTable.reloadData() 26 super.viewWillAppear(animated) 27 } 28 29 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 30 return cnt 31 } 32 33 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 34 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 35 let label = cell.viewWithTag(1) as! UILabel 36 label.text = "\(indexPath.row + 1)" 37 return cell 38 } 39 40}

条件下のみにCGRectZeroしたUIImageViewを再度入れてあげることで、
望むような動作になりました。
このほか、こうした方が良いという方法ありますでしょうか。

投稿2016/08/08 01:49

Y_M

総合スコア265

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

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

fuzzball

2016/08/08 02:10

表示しないのならUIImageViewを生成する必要はなく、 myImageView = nil でいいと思います。 ちなみに、footerの表示/非表示は、ViewControllerの開始時に切り替えるだけなのでしょうか?途中でセルの追加/削除が無いのであれば、viewDidLoadの中で、 セルが10個未満 → myTable.tableFooterView = myImageView セルが10個以上 → myTable.tableFooterView = nil でいいと思います。
Y_M

2016/08/08 02:16

説明足らずで申し訳ないです。 こちらに載せているコードでは固定となっていますが、 実際にこの機能を実装しようとしている別のプロジェクトではセル数は可変になります。 そのためこのような中途半端な書き方になっていますことをご容赦ください。
Y_M

2016/08/08 02:24

あと、このコメントをいただいて気付きました。 そもそもviewDidLoad内で1度Footerを設定してしまっているのがおかしいことに気が付きました。 数が確定後につけるかどうかを判断し、そこで初めてつけるかつけないかすると、 わざわざ消さなくてもいい気がしてきました。
fuzzball

2016/08/08 02:36

再度の確認になりますが、Y_Mさんの書いている「可変」というのは、 テーブルの表示開始時のことではなく、テーブルの表示後に ユーザの操作などによってセルの数が変わるということでしょうか?
Y_M

2016/08/08 03:21

>fuzzballさん その通りです。 今回の場合だと、サーバと通信し、受け取った情報を元にセル数が可変する。 という状況での可変になります。
fuzzball

2016/08/08 03:51

ということであれば、viewDidLoadではmyImageViewの準備だけしておいて、 セル数が変化する度に、 セルが10個未満 → myTable.tableFooterView = myImageView セルが10個以上 → myTable.tableFooterView = nil の切り替えを行えばいいと思います。
Y_M

2016/08/08 04:01

ご回答有り難うございます。 はい。そのようにしたら良いと思い、実装させていただきました。 ご協力感謝いたします。
guest

0

わざわざ作り直さなくても、高さを0にするだけではダメでしょうか?

swift

1tableView.tableFooterView.frame.size.width = 0.0 2//※全く未検証

あと、高さを変えるのは、numberOfRowsInSectionの中ではなく、
セルの数を変更しているところに書いた方が良いと思います。
(おそらくreloadしているでしょうから、その前に)

投稿2016/08/05 13:29

編集2016/08/05 13:33
fuzzball

総合スコア16731

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

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

Y_M

2016/08/08 01:30

「viewWillAppear」のreloadDataの直前に書き換え、 高さを0にしてみましたが、余白が残ったままとなってしまいます。 現状を追記しましたのでご回答いただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問