ナビゲーションバー&タブバーを非表示にする場合UIViewのは、全画面表示にサイズ変更されません。
-
12-09-2019 - |
質問
私は、通常の相互作用のためのタブバー&ナビゲーションバーを併設してアプリを持っています。私の画面の一つは、テキストの大部分であるので、私は、ユーザーが(ソートのPhotos.appのような)フルスクリーンに行くためにタップすることができます。
ナビゲーションバー&タブバーが隠されて、私はフルスクリーンするために、テキストビューのフレームに設定されています。問題は、タブバーがために使用場所については50pxの余白がある、あります。あなたはこのスクリーンショットからかどうかを確認することができます:
の削除死んImageShackのリンクの
私はこれを引き起こしているかわからないんだけど。私は念のために赤に、それの背景色を設定すると空白は、間違いなく、テキストビューの背後にあるビューではありません。何が原因だろうか?
** UPDATE **
私はUIWindowサブクラスのいくつかのヒットテストを行なったし、空白が実際に文書化されていない/未発表UILayoutContainerViewであることが分かりました。これは、タブバーの親ビューです。私は、直接このビューを操作することをお勧めしますとは思わないので、どのように私は、タブバーを非表示にできますか?
** UPDATE#2 **
私は、アニメーションの前&後self.viewのフレームをチェックし、親ビューが十分にリサイズされていないように見えます。
フルスクリーンに行く後、ビューのフレームは411ピクセル高さです。私は手動でフレームをいじっても運とautoResizeMaskを設定しようとしました。
**** UPDATE:ここでは最終的な結果だ****
- (void)toggleFullscreen {
isFullScreen = !isFullScreen; //ivar
//hide status bar & navigation bar
[[UIApplication sharedApplication] setStatusBarHidden:isFullScreen animated:YES];
[self.navigationController setNavigationBarHidden:isFullScreen animated:YES];
[UIView beginAnimations:@"fullscreen" context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:.3];
//move tab bar up/down
CGRect tabBarFrame = self.tabBarController.tabBar.frame;
int tabBarHeight = tabBarFrame.size.height;
int offset = isFullScreen ? tabBarHeight : -1 * tabBarHeight;
int tabBarY = tabBarFrame.origin.y + offset;
tabBarFrame.origin.y = tabBarY;
self.tabBarController.tabBar.frame = tabBarFrame;
//fade it in/out
self.tabBarController.tabBar.alpha = isFullScreen ? 0 : 1;
//resize webview to be full screen / normal
[webView removeFromSuperview];
if(isFullScreen) {
//previousTabBarView is an ivar to hang on to the original view...
previousTabBarView = self.tabBarController.view;
[self.tabBarController.view addSubview:webView];
webView.frame = [self getOrientationRect]; //checks orientation to provide the correct rect
} else {
[self.view addSubview:webView];
self.tabBarController.view = previousTabBarView;
}
[UIView commitAnimations];
}
(私はWebViewのにのTextViewを切り替えますが、オリジナルのテキストビューのために同じ作品)
解決
私は、タブバーだった49px高ホワイトスペースを残して、私はそれぞれの画面の下と上からタブバーとナビゲーションバーをアニメーション化されたこの正確な問題を抱えています。
これは、私自身がタブバーコントローラの子だっナビゲーションコントローラのビューのサブビューとしてフルスクリーンビューを追加しましたので、私の新しい「フルスクリーン」ビューは、実際にスペースを埋めていなかった理由があったことが判明しました。
は、それを修正するために、私は単純に(あなたのケース内のすべてのテキストを表示)UITabBarControllerのビューのサブビューとしての新しいフルスクリーンビューを追加します。
[[[self tabBarController] view] addSubview:yourTextView];
そして、あなたがする必要があるすべてはあなたのサブビューのフレームは480×320ピクセルであることを確認してあり、それは
(以前の神秘的な空白だった領域を含む)画面を埋める必要があります他のヒント
あなたは間違いなく、タブバーが画面オフになるように、ビューのフレームをシフトすることにより、正しい表示されます何かを作ることができます。私は他の誰かがそれをしようと述べた、とあなたはそれが動作しませんでしたけど、私は、問題は、あなたがしようとしたときtextviewsが適切にマスク設定のサイズを変更していなかったことであると思います。以下は動作するはずのコードがあります:
- (void)viewDidLoad {
[super viewDidLoad];
currentlyHidden = NO;
}
- (void) hideStuff {
SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
self.navigationController.navigationBarHidden = YES;
CGRect newFrame = appDelegate.tabBarController.view.frame;
newFrame.size.height += appDelegate.tabBarController.tabBar.frame.size.height;
appDelegate.tabBarController.view.frame = newFrame;
}
- (void) showStuff {
SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
CGRect newFrame = appDelegate.tabBarController.view.frame;
newFrame.size.height -= appDelegate.tabBarController.tabBar.frame.size.height;
appDelegate.tabBarController.view.frame = newFrame;
self.navigationController.navigationBarHidden = NO;
}
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (currentlyHidden) {
[self showStuff];
currentlyHidden = NO;
} else {
[self hideStuff];
currentlyHidden = YES;
}
}
また、これはあなたがあなたのニブなどのセットアップを持っているかを明確に敏感であるため、私はあなたはそれをダウンロードし、それを見て得ることができるので、オンラインのAAプロジェクトを掲示します。それはかなり最小限のデモ、デリゲートはタブコントローラを設定し、メインnibからのビューコントローラを埋め込むだけでナビゲーションベースのプロジェクトです。残りはRootViewControllerペン先やクラスです。バーはタッチが始まるたびに切り替え、これだけ画面をタップしています。もちろん、実際のアプリであなたがジャンプするように表示されませんので、内容を詰めるスクロールビューを調整する必要があるかもしれません。
は、あなたがhidesBottomBarWhenPushed
ためにあなたのビューコントローラのYES
プロパティを設定することがありますか?あなたのinitWithNibName:bundle:
やinitWithCoder:
方法でこれを設定する必要があります。それはNAVコントローラにプッシュされると、このタブバーを非表示にし、コンテンツビューは、一番下まで延長すべきである。
たぶん、タブバーエリアの組み込みの一部である別のビューがありますか?つまり、非表示にするには、追加のものです。これは、ビューが周りにあるものを見るのに役立ちます。
for (UIView *viewy in [self.navigationController.view subviews])
{
NSLog([viewy description]);
}
私はあなたが次の行で、ナビゲーションスタックにプッシュされる新しいビューをマークした場合に限り、それがスタックにあるようタブバーを隠すことがわかっています。
scrollViewController.hidesBottomBarWhenPushed = YES;
私は、問題は、私もこれでいくつかの問題をヒットしてきたあなたは、タブバーコントローラにまだだということであると信じて、そして私の制御をアプリデリゲート、タブバーコントローラのための2つのビューを作成することになった、とタブバーコントローラはのコマンドを取るしようとするものを保持している別のUIViewの。あなたは、アプリのデリゲートにビューを渡すと、おそらくそこにそれを使うだろうか?
の新しいのViewControllerが設定される前に限り、あなたはこれを行うと、の、そのビューを埋めるためにサイズが変更されます、TabBarControllersが画面より大きく表示作ってみましょう新しいフレーム!
私のテストでは、私はtabBarControllerを使用:shouldSelectViewController:デリゲートメソッドは、現在になろうとしているかを表示コントローラをチェックし、それに応じてTabBarController.view.frameを設定します。たとえばます:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
if( viewController == second)
tabBarController.view.frame = CGRectMake( 0, 20, 320, 500);
else
tabBarController.view.frame = CGRectMake( 0, 20, 320, 460);
}
これはまだされていない場合は非常にあなたが必要なもの、のUIViewControllerのhidesBottomBarWhenPushedプロパティに探してみてください。 yesに設定すると、コントローラは、ナビゲーションスタックにプッシュされている場合、これは下のバーを非表示を行います。
私は、ウィンドウにビューを移動します。例えばます。
myView = [self.view retain];
self.view = nil;
[window addSubview:myView];
と戻ります。
[myView removeFromSuperView];
self.view = myView;
[myView release];
myView = nil;
ウィンドウの子としてビューを追加することで、それは完全にフルスクリーンにすることができ、タブバーの上になります。
あなたは、その後でこれを組み合わせることができます。
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
回転を検出します。 (私は...?あなたはそれを回転させるためにview.transform = CGAffineTransformMakeRotationと組み合わせると思います)。
私は同様の問題がありました。ハリーは、前述のように、それは、タブバーコントローラの内部コントローラでナビゲーションコントローラの理由です。あなたのビューを再描画するためにどのように別の方法を発見し、正しいフレームを持って、あなたのコントローラでは、以下を追加します。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Here you can make your tabBarControlelr.view.hidde = true or use any animation that hides UITabBar. I made
[TabBarController setTabBarHidden:YES];
self.navigationController.view.frame = CGRectMake(self.navigationController.view.frame.origin.x, self.navigationController.view.frame.origin.y, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height + 50);
[self.navigationController.view setNeedsLayout];
}
そして、ここでは、私はそれを隠す方法です。私はそれが直接TabBarControlelrのメソッドやクラスメソッドのラッパー呼び出すことができます:
+ (void)setTabBarHidden:(BOOL)hidden
{
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
TabBarController *tabBarController = (TabBarController *) delegate.window.rootViewController;
if ([tabBarController isKindOfClass:[TabBarController class]]) {
[tabBarController setTabBarHidden:hidden];
}
}
- (void)setTabBarHidden:(BOOL)hidden
{
if (self.tabBar.hidden == hidden) {
return;
}
if (hidden == NO) {
self.tabBar.hidden = hidden;
}
[UIView animateWithDuration:0.15 animations:^{
self.tabBar.frame = CGRectOffset(self.tabBar.frame, 0, ( hidden ? 50 : -50 ));
} completion:^(BOOL finished) {
self.tabBar.hidden = hidden;
}];
}
あなたがInterface Builderのを使用している場合は、自動サイズ変更がサイズインスペクタに適切に設定されていることを確認。 あなたは、コードにUITextViewを作成する場合は、フレームが十分とビューの親が(とその親)にも十分な大きさであることに大きくなるように設定してください。簡単にするために、直接ウィンドウにビューを追加し、そこから内側に移動します。
そのスーパーにビューを移動するには:
- (void)moveViewToSuperview:(UIView *)view
{
UIView *newSuperview = [[view superview] superview];
[view removeFromSuperview];
[newSuperview addSubview:view];
[newSuperview bringSubviewToFront:view];
}
あなたは「再書き込み」自体(あなたが使用しているものは何でもオブジェクトのプロパティの.textをリセットする)ために、テキストを強制しようとしたことがありますか?私は、ビューは単に再確認したり、そのデータを再描画し、強制していないだけの修正であると思われる多くの事例がありました。これは、ユーザーエクスペリエンスの観点から良くない場合は、ユーザーがタッチした後NAV / tabbarsを透明に作ってみるかもしれない、と彼らは消える前に。これは、通常画面のフルサイズのビューを拡張します。
UITabBarControllerをrootViewController(navigationController)に押されている場合。あなたは次のことを試すことができます:
まず、ステータスバー/タブバーを非表示;
[self.navigationController pushViewController:aBlankViewController animated:NO];
[self.navigationController popViewControllerAnimated:NO];
画面が調整中に衝撃を与えるでしょうがあなたは、ホワイトスペースを再利用することができるはず...
私は同様の問題を経験してきた、この議論は参考になりました:のUIWebView iPadのサイズにする
トニーのの答えは、私はあなたがサブビューを作成するとき、それは次のようなセットアップコードに便利ですしていることがわかりました。
self.tabBarController.tabBar.frame = self.view.bounds;
このようなセグエの準備のコードを入れて、私のために完璧に動作します:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ViewPhoto"]) {
ImageView *vc = [segue destinationViewController];
NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
NSString *Title = [photoNames objectAtIndex:selectedIndex];
[vc setSelectedTitle:[NSString stringWithFormat:@"%@", Title]];
vc.hidesBottomBarWhenPushed = YES;
}
}
、ビューの次元にスペースを余分にAMTを追加します。 、それはあなたが上から上のテキストビューを入れている根本的なビューをどうするahveかもしれませんが、ちょうど次元を追加すると、それを行う必要があります。