皆さん、私は iPhone と Objective-C の初心者で、手続き型言語の長いバックグラウンドを持っています。
Whole Foods のレシピ検索の機能をエミュレートしようとしています。そのアプリでは、画面の上部に NavigationBar、下部に TabBar、および画面の上部に向かって 3 つのボタンのグループがあります。ボタンを選択すると、下からスライドアップ画面が表示され、TabBar が覆われます。スライドアップ画面には、ピッカーと「完了」ボタンが含まれています。これはモーダル画面ではありません。上から別のボタンを選択でき、ピッカーが動的に変化するという事実からもわかります。また、これはアクション シートではありません。
この動作を再現するために、iPhone の ScrollViewSuite サンプルの Autoscroll プロジェクトを使用して、モーダルではないスライドアップ画面を表示しました。これはうまくいきました。さまざまなボタンを選択することで、スライドアップ画面のピッカーを動的に変更できます。
スライドアップ画面で TabBar をカバーしたかったので、http://osdir.com/ml/iPhoneSDKDevelopment/2009-01/msg00246.htmlからの提案を使用しました。つまり、tabBarController.view.frame の高さを増やすと、実質的にフレームが画面よりも大きくなり、TabBar (下部に固定されている) がユーザーのビューから削除されます。スライドアップ画面と TabBar の非表示の組み合わせは許容範囲でした。人生は比較的バラ色でした。私がする必要があったのは、NavigationBar を追加することだけでした。
しかし、IB の画面を View Controller から Navigaion Controller の画面に変更したとき、TabBar を非表示にすると、ビューに 20 ピクセルのシフトが発生しました!? NavigationBar 自体は問題ありませんが、その下にある他のすべてのものは 20 ピクセル上に移動します。(ただし、スライドアップ画面は問題ありません。) (20 ピクセルは iPhone のステータス バーの高さです。)
私の IB は、TabBarCongroller を備えた MainWindow.xib と、その中の NavigationControllers を持つ標準的な配置です。
コードは次のとおりです。
- (void)toggleThumbView
{
if (!thumbViewShowing)
{
[self createSlideUpViewIfNecessary]; // no-op if slideUpView has already been created
//Hide the TabBar, which introduces a 20 pixel shift up of everything except the navigation bar
UITabBar *ntoTabBar = self.tabBarController.tabBar;
CGRect tbcFrame = self.tabBarController.view.frame;
self.tabBarController.view.frame = CGRectMake(tbcFrame.origin.x ,
tbcFrame.origin.y ,
tbcFrame.size.width ,
tbcFrame.size.height + ntoTabBar.frame.size.height);
//The following code really doesn't matter for discussions about the problem, simply resizing the
//tabBarController.view.frame above has already introduced the 20 pixel problem
CGRect frame = [slideUpView frame];
frame.origin.y -= frame.size.height ;
frame.origin.y += ntoTabBar.frame.size.height ;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3];
[slideUpView setFrame:frame];
[UIView commitAnimations];
thumbViewShowing = !thumbViewShowing;
}
}
autoresizingMask と autoResizesSubviews で遊んでみました。以下は、20 ピクセルのシフトを排除します。
[self.tabBarController.view setAutoresizesSubviews:NO];
残念ながら、TabBar が非表示になることもありません。20 ピクセルが手がかりかもしれないと考えて、すべての XIB で IB の「全画面表示が必要」のチェックを外してみましたが、役に立ちませんでした。NIB からのサイズ変更をチェックしてチェックを外し、すべてのシミュレートされたインターフェイス要素を削除して、プログラムがサイズ変更を制御できるようにしました (それらをシミュレートするとプログラム制御が禁止されると思いますか?) 繰り返しますが、何もないようですトリックをやっています。tbcFrame.origin.y を 20 ピクセル増やすと、スクリーン シフトが解消されますが、NavigationBar が 20 ピクセル低くなり、下にあるものはすべて覆われ、上部に 20 ピクセルの素敵な余白が残ります。この問題は 3.0 SDK シミュレーターで発生し、3.1.2 にアップグレードしました。最新/最高のものを持っているのはうれしいですが、それは私の問題を解決しませんでした.
まだハゲじゃなかったら、髪を抜いていただろう。どこを見るべきかについての提案は大歓迎です。別のViewControllerを介してスライドアップビューをプッシュし、プログラムによるTabBarの非表示をなくした方がよいでしょうか? 何かのようなもの:
DetailViewController *dvc = [[DetailViewController alloc] init];
dvc.hidesBottomBarWhenPushed = YES;
[[self navigationController] pushViewController:dvc animated:YES];
[dvc release];
前もって感謝します、
ボブ B.