200回記念アプリは、ようやく説明書の下準備が終わって、明日にはウェブにアップロードできそう。これが終わったらAppleにいよいよ申請。
テーブルビュー矩形より内容部の矩形の方が大きい場合なら、前回やったようなフッタービューの底辺の座標変数triggerTailは有効なわけですが
![テン*シー*シー-1](https://stat.ameba.jp/user_images/20100405/22/xcc/8a/e5/j/o0355042910483802742.jpg?caw=800)
内容部の矩形の方が小さい場合、テーブルビュー矩形は最初からtriggerTailをオーバーしちゃってるんですな。
![テン*シー*シー-2](https://stat.ameba.jp/user_images/20100405/22/xcc/ae/83/j/o0355039510483802745.jpg?caw=800)
これじゃ、いつでも引っ張りだされてる状態が成り立っちゃうわけで…
この場合は、フッタービューの底辺とではなくテーブルビュー矩形の底辺と比較する必要があるわけです。
ということはUpdateTriggerクラスのscrollViewDidScrollメソッドのtableTailとtriggerTailを比較する前に、以下のチェックを入れることで対応できるはず。
でまあ、これできっちり動くようになったので、DetailViewController、CoDetailViewControllerクラスにも前回と同じ要領でUpdateTriggerインスタンスを実装します。
機能をUpdateTriggerクラスにまとめたんで、コピペも簡単。
↑こいつと
↑こいつは単純にコピペでOK。
UpdateTriggerDelegateのupdate: メソッドだけは、更新するデータが違うので別にしなくちゃならない。DetailViewControllerは提案なのでdbに投げるメッセージは提案用の
を使い。CoDetailViewControllerは支持なのでdbに投げるメッセージは支持用の
を使うことになる。
ま、こうやるだけで全テーブルに更新機能がついたわけですが、CoDetailViewController側のフッターでまたまた問題発生。
![テン*シー*シー-3](https://stat.ameba.jp/user_images/20100405/23/xcc/31/93/j/o0360031810483876131.jpg?caw=800)
DetailViewControllerはどっちもOK
![テン*シー*シー-4](https://stat.ameba.jp/user_images/20100405/23/xcc/56/55/j/o0193032210483876141.jpg?caw=800)
CoDetailViewControllerのヘッダーはOK
![テン*シー*シー-5](https://stat.ameba.jp/user_images/20100405/23/xcc/dc/31/j/o0283029410483876147.jpg?caw=800)
CoDetailViewControllerのフッターは表示された時点で「手を離すと更新します」状態に…
て、なんんでじゃあああ、直したはずやんけ~と世界の中心で叫んだんですが、冷静に考えるとテーブルビュー矩形より内容部の矩形の方が大きいんで、今回の対応とはまた別の問題らしいんですな。
結論から言うと、この不具合はUpdateTriggerクラスは無実で、CoDetailViewControllerのUITableViewの作り方に問題がありました。
遥か昔の銀河のはての話になるけどその(165)で「Interface BuilderではUIView一枚貼っておいて、残りのビューをプログラム上で作成する」という実験をしてたわけね。
テーブル作るのにXIB使ってないのよ。
で、XIBだと自動的に設定される親ビューの矩形変更に連動してテーブルの矩形を変更する指定をしてなかった。
どういう事かというと、viewDidLoadの時点ではテーブルの親viewにタブバーが付いていないので、そこにピッタリとテーブルビューを貼付けていると後でタブバーが追加された時点でテーブルビューの下の部分がタブバーの下に隠されちゃうんですな。
![$テン*シー*シー-6](https://stat.ameba.jp/user_images/20100406/00/xcc/d0/00/j/o0323030910483940458.jpg?caw=800)
で、この対応のためにテーブルの親viewの高さはタブバーの表示に合わせて少し縮むようになとるわけで、XIBでテーブルを設定してる場合、この親viewの収縮にあわせてテーブルの高さも変わるように自動的に設定してくれてるんでDetailViewControllerの方は問題がなかったんですな。
CoDetailViewControllerの実験的にプログラム上で作ったテーブルにはその親viewの矩形変化に連動する(正確にはどう連動するかの)指定がなかったわけです。
結果、タブバーにテーブルが潜り込んでしまってる形になってしまい、
![$テン*シー*シー-7](https://stat.ameba.jp/user_images/20100406/00/xcc/ad/92/j/o0347025110483940460.jpg?caw=800)
フッターが画面上に引き出された時点では、十分に引っ張られきった状態になってたわけです。
これを解決するにはCoDetailViewControllerクラスのviewDidLoadメソッドで作成したUITableViewインスタンスのtviewのプロパティautoresizingMaskにUIViewAutoresizingFlexibleHeightを設定するだけです。
こいつが親viewの矩形が変わるさいには、高さを調整して対応してねという指定になるわけですな。
解決しました。
ヘッダーフッターの見栄えがいまいちだけど、まあ、習作だからOK牧場。
------------
サンプルプロジェクト:konohana_test22.zip
テーブルビュー矩形より内容部の矩形の方が大きい場合なら、前回やったようなフッタービューの底辺の座標変数triggerTailは有効なわけですが
![テン*シー*シー-1](https://stat.ameba.jp/user_images/20100405/22/xcc/8a/e5/j/o0355042910483802742.jpg?caw=800)
内容部の矩形の方が小さい場合、テーブルビュー矩形は最初からtriggerTailをオーバーしちゃってるんですな。
![テン*シー*シー-2](https://stat.ameba.jp/user_images/20100405/22/xcc/ae/83/j/o0355039510483802745.jpg?caw=800)
これじゃ、いつでも引っ張りだされてる状態が成り立っちゃうわけで…
この場合は、フッタービューの底辺とではなくテーブルビュー矩形の底辺と比較する必要があるわけです。
ということはUpdateTriggerクラスのscrollViewDidScrollメソッドのtableTailとtriggerTailを比較する前に、以下のチェックを入れることで対応できるはず。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
・
・
if (triggerTail < tableView.bounds.size.height) {
// 全項目の高さがテーブルの高さを下回るので、triggerTailを
// tableView.bounds.size.heightに変更する。
triggerTail = tableView.bounds.size.height;
}
・
if ((tableTail > triggerTail + 20) && (footerOn == NO)) {
・
・
}
・
・
if (triggerTail < tableView.bounds.size.height) {
// 全項目の高さがテーブルの高さを下回るので、triggerTailを
// tableView.bounds.size.heightに変更する。
triggerTail = tableView.bounds.size.height;
}
・
if ((tableTail > triggerTail + 20) && (footerOn == NO)) {
・
・
}
でまあ、これできっちり動くようになったので、DetailViewController、CoDetailViewControllerクラスにも前回と同じ要領でUpdateTriggerインスタンスを実装します。
機能をUpdateTriggerクラスにまとめたんで、コピペも簡単。
- (void)viewDidLoad {
・
updateTrigger = [[UpdateTrigger alloc] init];
[updateTrigger adapteTrigger:self.tableView];
updateTrigger.delegte = self;
・
・
updateTrigger = [[UpdateTrigger alloc] init];
[updateTrigger adapteTrigger:self.tableView];
updateTrigger.delegte = self;
・
↑こいつと
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
[updateTrigger scrollViewWillBeginDragging:scrollView];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[updateTrigger scrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
[updateTrigger scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}
[updateTrigger scrollViewWillBeginDragging:scrollView];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[updateTrigger scrollViewDidScroll:scrollView];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
[updateTrigger scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}
↑こいつは単純にコピペでOK。
UpdateTriggerDelegateのupdate: メソッドだけは、更新するデータが違うので別にしなくちゃならない。DetailViewControllerは提案なのでdbに投げるメッセージは提案用の
[db connectForSuggestion:contributeID suggestion:ID forword:NO];
を使い。CoDetailViewControllerは支持なのでdbに投げるメッセージは支持用の
[db connectForVote:contributeID suggestion:sugestionID vote:ID forword:NO];
を使うことになる。
ま、こうやるだけで全テーブルに更新機能がついたわけですが、CoDetailViewController側のフッターでまたまた問題発生。
![テン*シー*シー-3](https://stat.ameba.jp/user_images/20100405/23/xcc/31/93/j/o0360031810483876131.jpg?caw=800)
DetailViewControllerはどっちもOK
![テン*シー*シー-4](https://stat.ameba.jp/user_images/20100405/23/xcc/56/55/j/o0193032210483876141.jpg?caw=800)
CoDetailViewControllerのヘッダーはOK
![テン*シー*シー-5](https://stat.ameba.jp/user_images/20100405/23/xcc/dc/31/j/o0283029410483876147.jpg?caw=800)
CoDetailViewControllerのフッターは表示された時点で「手を離すと更新します」状態に…
て、なんんでじゃあああ、直したはずやんけ~と世界の中心で叫んだんですが、冷静に考えるとテーブルビュー矩形より内容部の矩形の方が大きいんで、今回の対応とはまた別の問題らしいんですな。
結論から言うと、この不具合はUpdateTriggerクラスは無実で、CoDetailViewControllerのUITableViewの作り方に問題がありました。
遥か昔の銀河のはての話になるけどその(165)で「Interface BuilderではUIView一枚貼っておいて、残りのビューをプログラム上で作成する」という実験をしてたわけね。
テーブル作るのにXIB使ってないのよ。
で、XIBだと自動的に設定される親ビューの矩形変更に連動してテーブルの矩形を変更する指定をしてなかった。
どういう事かというと、viewDidLoadの時点ではテーブルの親viewにタブバーが付いていないので、そこにピッタリとテーブルビューを貼付けていると後でタブバーが追加された時点でテーブルビューの下の部分がタブバーの下に隠されちゃうんですな。
![$テン*シー*シー-6](https://stat.ameba.jp/user_images/20100406/00/xcc/d0/00/j/o0323030910483940458.jpg?caw=800)
で、この対応のためにテーブルの親viewの高さはタブバーの表示に合わせて少し縮むようになとるわけで、XIBでテーブルを設定してる場合、この親viewの収縮にあわせてテーブルの高さも変わるように自動的に設定してくれてるんでDetailViewControllerの方は問題がなかったんですな。
CoDetailViewControllerの実験的にプログラム上で作ったテーブルにはその親viewの矩形変化に連動する(正確にはどう連動するかの)指定がなかったわけです。
結果、タブバーにテーブルが潜り込んでしまってる形になってしまい、
![$テン*シー*シー-7](https://stat.ameba.jp/user_images/20100406/00/xcc/ad/92/j/o0347025110483940460.jpg?caw=800)
フッターが画面上に引き出された時点では、十分に引っ張られきった状態になってたわけです。
これを解決するにはCoDetailViewControllerクラスのviewDidLoadメソッドで作成したUITableViewインスタンスのtviewのプロパティautoresizingMaskにUIViewAutoresizingFlexibleHeightを設定するだけです。
tview.autoresizingMask = UIViewAutoresizingFlexibleHeight;
こいつが親viewの矩形が変わるさいには、高さを調整して対応してねという指定になるわけですな。
解決しました。
ヘッダーフッターの見栄えがいまいちだけど、まあ、習作だからOK牧場。
しかし、これだとスクロールバーがめり込むんだよね。やっぱ、王道のviewDidAppearで、tableViewの高さを調整するのが吉か?
2011.6.16
2011.6.16
------------
サンプルプロジェクト:konohana_test22.zip