2009-07-10
■ [疑問] 解決!→UITableViewのサイズをアプリ動作中に変更する方法が分からない
![[疑問] 解決!→UITableViewのサイズをアプリ動作中に変更する方法が分からない - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント [疑問] 解決!→UITableViewのサイズをアプリ動作中に変更する方法が分からない - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント](http://r.hatena.ne.jp/images/popup.gif)
前日の日記:
「 [疑問] UITableViewのサイズをアプリ動作中に変更する方法が分からない - Ni chicha, ni limona - 平均から抜けられない僕 - iPhoneアプリ開発グループ」
で書いていた、テーブルビューのサイズ変更をするとテーブル表示がおかしくなるという問題が、その原因とともに解決したので記録を残しておきます。
以下が修正後のソースです(実際はもう少し手を入れましたが、今回は違いが分かるように同じソースを使っています)。
- (void)toggleEdit:(UIBarButtonItem *)sender { NSLog(@"toggleEdit: is called by %@", sender); [self.tableView setEditing:!self.tableView.editing animated:YES]; // User interfaceの向上(削除中は右上ボタンを「完了」に変更) if (self.tableView.editing) { // [self.tableView beginUpdates]; ← この処理を書いてはいけなかった! self.navigationItem.rightBarButtonItem.style = UIBarButtonItemStyleDone; self.navigationItem.rightBarButtonItem.title = @"Done"; } else { // [self.tableView endUpdates]; ← この処理を書いてはいけなかった! self.navigationItem.rightBarButtonItem.style = UIBarButtonItemStyleBordered; self.navigationItem.rightBarButtonItem.title = kEditButtonMessage; } // ツールバーのフレームイン/アウト [UIView beginAnimations:@"Move in/out toolbar" context:nil]; if (self.tableView.editing) { _toolBar.frame = CGRectMake(0.0f, 395.0f, 320.0f, 36.0f); self.tableView.bounds = CGRectMake(0.0f, 0.0f, 320.0f, 370.0f); // 3の処理 [self.tableView reloadData]; } else { _toolBar.frame = CGRectMake(0.0f, 480.0f, 320.0f, 36.0f); self.tableView.bounds = CGRectMake(0.0f, 0.0f, 320.0f, 406.0f); // 4の処理 [self.tableView reloadData]; } [UIView commitAnimations]; }
ということで、テーブルビューに対して
「Edit開始でbeginUpdates」
「Edit終了でendUpdates」
という処理を行わせていたことが悪かったようです。
これらのメソッドはテーブルの情報を実際に変更しているコードの前後で書いてあげればよく、上記ソースのようにイベントをまたぐような大きな処理で使わせるものではありませんでした。
これを消すことで、ものの見事に動くようになりました。
お騒がせいたしました。
たしかこれ、エリカ本で書かれていた方法なんだよなぁ・・・。
情報が間違っているのか、それとも少しずつ情報が古くなっているのか。公式ドキュメントも含めて、記述されている情報を鵜呑みにしてはいけないという好例になってしまいました。
参考サイト
・テーブルのセルの削除や追加にbeginUpdates/endUpdatesは必要か(1) - iPhoneアプリ開発まっしぐら★ - iPhoneアプリ開発グループ
・テーブルのセルの削除や追加にbeginUpdates/endUpdatesは必要か(2) - iPhoneアプリ開発まっしぐら★ - iPhoneアプリ開発グループ
上記のサイトで「もしかしてひょっとして」と気づきました。多謝です。
あえて付け加えるなら、
「beginUpdatesとendUpdatesは、複数のセル情報を一度に入れ替える場合にのみ必要」
といったところですかね。
Thanks
kouichiさん、ohnoさん、有益なコメントをありがとうございました。問題解決のヒントになっただけでなく、知識も広げられました。
- (void)viewWillAppear:(BOOL)animated {
self.toolbarItems = toolbarButtons;
self.navigationController.toolbarHidden = NO;
}
私がやったところでは、本記事の方法ではうまく行きませんでした。
toolbarItemsはOS3.0から導入されたプロパティですね。私はまだ2.2.1をDeployment Targetにしているためこの方法は使えないですが、将来のために参考にさせていただきます。
貴重な情報、ありがとうございました。
Tableviewのサイズを変更できずに私も困っています。
上記方法でも変更できませんでした。
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.rowHeight=128.0;
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
self.tableView.autoresizingMask);
//self.tableView.frame = CGRectMake(100,100,320,100);//NG
self.tableView.bounds = CGRectMake(100.0f, 100.0f, 320.0f, 370.0f); // 3の処理
[self.tableView reloadData];
}
1つ簡単なトリックとして、テーブルビューを置く時はUIViewを下に一枚敷いた上でウィンドウに配置すると、UIView(テーブルビューではない)のサイズ変更に対して上手に追随してくれてサイズ変更も容易、という方法があります。
いかがでしょうか?