Hatena::Groupiphone-dev

Ni chicha, ni limona - 平均から抜けられない僕

2009-07-09

[疑問] UITableViewのサイズをアプリ動作中に変更する方法が分からない 20:20  [疑問] UITableViewのサイズをアプリ動作中に変更する方法が分からない - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  [疑問] UITableViewのサイズをアプリ動作中に変更する方法が分からない - Ni chicha, ni limona - 平均から抜けられない僕  [疑問] UITableViewのサイズをアプリ動作中に変更する方法が分からない - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

今、タイトルのことで悩んでいます。

やろうとしていることは、


  1. ナビゲーションバー付きのテーブルビューを最初に表示しておいて、ナビゲーションバー上には「Edit」ボタンを付けておく
  2. 「Edit」ボタンが押されたら、隠しておいたツールバー(UIToolBar)を表示させて、編集画面に移行する
  3. このツールバーを表示させたとき、テーブルビューの大きさをツールバーぶん縮める(でないとツールバーに隠れる最後の方の行を編集できないため)
  4. 「Edit」ボタン(UIではDoneに変えてます)をもう一度押すと、ツールバーは隠れてテーブルビューも元の大きさに戻る。

という処理。Safariブックマーク編集のときのようなイメージを持ってもらうと良いかもしれないです。


ところが、上記の3のときに縮めたテーブルビューが行全体の一部しか表示しなくなってしまう問題に当たってしまいました。たとえば全体で20行程度のテーブルを表示させているときに3で縮めると、今画面上に表示されているぶんはそのまま残りつつも、残りの行が何も表示されなくなってしまうのです(スクロールは20行ぶんは行えるみたい)。

ただし4の処理を行えば、また元通りです。


どなたか同じような症状に陥った方っていますか?

ちなみに「Edit」を押したときの処理はこんな風にしています。

- (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];
}

tableView.boundsではなくtableView.frameでも全く同じ状況でした。


さて、困った。

kouichikouichi2009/07/09 21:14同じことをアプリケーションで実装していますが、tableView.frame で期待通りの動作をします。
SDK のバージョンを変えて試してみて、すべて同じ状況ならプログラムのどこかがおかしい?
異なるバージョンで動作した場合は、SDK のバグと問題を切り分けることができないですかね。

paellapaella2009/07/09 21:29ありがとうございます!
SDKは2.2.1と3.0のデバイス/シミュレータ全ての組み合わせで試したのですが、まったく同じ症状でした。ということは私のビューの作り方か、もしくはその取り扱いのどこかに問題がある可能性が濃厚ですね。

方向性としては間違っていなかったということが、何よりの収穫です。
kouichiさん、ありがとうございます。がんばってみます。

kouichikouichi2009/07/09 21:47補足。私のコードでは、toolbar.hidden = YES として tableView の frame.size.height を toolbar の高さ分だけ増やしていました。toolbar.hidden = NO の場合は、逆の処理をして tableView の高さを減らしています。つまり、toolbar の frame は loadView で作成した後は、
変更していません。なお、IB は使わないで Programmatically にコードを書いています。

ohnoohno2009/07/10 00:34こんなのはどうでしょう?
的外れでしたらごめんなさい。

CGRect tableViewRect = CGRectMake(0,0,320,412);

UITableView *tv = [[UITableView alloc] initWithFrame:tableViewRect style:UITableViewStylePlain];
tv.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight);
tv.delegate = self;
tv.dataSource = self;

UIView *totalView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[totalView addSubview:tv];
self.view = totalView;
[tv release];
[totalView release];

paellapaella2009/07/10 08:12kouichiさん:
たびたびありがとうございます。
サンプルとを比較してみると、ナビゲーションコントローラー内のRootViewControllerに相当するところがUINavigationControllerを継承していたり、表示するビューのxibファイルでTableViewを再定義していたり(NavigationControllerでTableViewは自動的に作られるはず)と、幾つか問題があることが分かりました。

それを修正してもまだ直っていないので、kouichiの方法も含めて見直してみます。ありがとうございます。

paellapaella2009/07/10 08:25ohnoさん:
ありがとうございます。
autoresizingMaskプロパティは知りませんでした。なるほど、ビューの関係が適切であればきちんとリサイズしてくれそうですね。

こちらはまだ試していないのですが、試してみますね。
ありがとうございます。

※ちなみに今も同じ現象が出ています。しっかり調べます。

paellapaella2009/07/10 13:08わかりました!そして意図通りテーブルがリサイズ&再描画されるようになりました!

別記事でまとめます。皆さん、ありがとうございました。