web-dev-qa-db-ja.com

ナビゲーションバーとタブバーを非表示にすると、UIViewがフルスクリーンにサイズ変更されない

通常の操作のためのタブバーとナビゲーションバーを備えたアプリがあります。私の画面の1つはテキストの大部分です。そのため、ユーザーがタップして全画面に移動できるようにします(Photos.appのようなものです)。

ナビゲーションバーとタブバーが非表示になり、テキストビューのフレームを全画面表示に設定しました。問題は、タブバーがあった場所に約50pxの空白があることです。次のスクリーンショットから確認できます。

削除されたImageShackリンクを削除

何が原因なのかわかりません。空白はテキストビューの背後のビューではありません。念のため、背景色を赤に設定しているためです。何が原因でしょうか?

**更新**

UIWindowサブクラスでいくつかのヒットテストを行ったところ、空白が実際にはドキュメント化されていない/公開されていないUILayoutContainerViewであることがわかりました。これはtabBarの親ビューです。このビューを直接操作することはお勧めしません。タブバーを非表示にするにはどうすればよいですか?

**更新番号2 **

アニメーションの前後にself.viewのフレームを確認しましたが、親ビューのサイズ変更が不十分なようです。

全画面表示にした後、ビューのフレームの高さはわずか411ピクセルです。手動でフレームをいじってみて、autoResizeMaskを設定してもうまくいかなかった。

****更新:これが最終結果です****

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

(私はテキストビューをウェブビューに切り替えましたが、元のテキストビューでも同じように機能します)

37
Ben Scheirman

画面の下部と上部のそれぞれにあるタブバーとナビゲーションバーをアニメーション化して、タブバーのある場所に49pxの高さの余白を残したところ、この問題が発生しました。

私の新しい「フルスクリーン」ビューが実際にスペースを埋めていなかった理由は、ナビゲーションコントローラーのビューのサブビューとしてフルスクリーンビューを追加していたためで、それ自体がタブバーコントローラーの子でした​​。

これを修正するには、UITabBarControllerのビューのサブビューとして、新しいフルスクリーンビュー(この場合はすべてのテキストを含むビュー)を追加しました。

 [[[self tabBarController] view] addSubview:yourTextView]; 

次に、サブビューのフレームが480 x 320ピクセルであることを確認し、それが画面(以前は神秘的な空白だった領域を含む)に収まるようにする必要があります。

29
Harry

タブバーが画面から外れるようにビューのフレームをシフトすることで、正しく表示されるものを確実に作成できます。他の誰かがそれを試したと言っていて、あなたはそれがうまくいかないと言ったのを知っていますが、問題はあなたが試したときに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;
  }
}

さらに、これはあなたのペン先などのセットアップ方法に完全に敏感なので、私は posting プロジェクトをオンラインにしていますので、ダウンロードしてそれを見ることができます。これはかなり最小限のデモで、デリゲートがタブコントローラをセットアップし、メインのnibからビューコントローラを埋め込むナビゲーションベースのプロジェクトにすぎません。残りはRootViewController nibとクラスにあります。タッチが始まるとバーが切り替わるので、画面をタップするだけです。もちろん、実際のアプリでは、コンテンツがジャンプして見えないようにスクロールビューを調整する必要があるかもしれません。

5
Louis Gerbarg

ビューコントローラーのhidesBottomBarWhenPushedプロパティをYESに設定しましたか? initWithNibName:bundle:またはinitWithCoder:メソッドでこれを設定する必要があります。ナビゲーションコントローラーにプッシュされると、タブバーが非表示になり、コンテンツビューが下まで拡張されます。

3
Daniel Dickison

同様の問題がありました。ハリーが述べたように、それはタブバーコントローラーの内部コントローラーであるナビゲーションコントローラーの理由です。ビューを再描画して正しいフレームを取得する別の方法を見つけました。、コントローラーに以下を追加します:

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

新しいビューをマークすると、次の行でナビゲーションスタックにプッシュされ、スタック上にある限りタブバーが非表示になることがわかりました。

scrollViewController.hidesBottomBarWhenPushed = YES;

2
Steve

たぶん、タブバー領域の組み込み部分である別のビューがありますか?つまり、非表示にする追加の何かです。これは、周囲のビューを確認するのに役立ちます。

for (UIView *viewy in [self.navigationController.view subviews])
{
    NSLog([viewy description]);
}
2
ojreadmore

全画面表示を選択すると、ビューがウィンドウに移動します。例えば.

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と組み合わせて回転させると思います...?)

1
Benjie

私は問題があなたがまだタブバーコントローラーにいることだと信じています、私もこれでいくつかの問題にぶつかりました、そして結局、アプリデリゲートを制御するための2つのビュー、タブバーコントローラーと別のuiviewを作成しましたこれは、タブバーコントローラーがコマンドを取得しようとするあらゆるものを保持します。あなたはあなたの見解をアプリデリゲートに渡し、そこでそこで使用することができますか?

1
James Hall

テキストを強制的に「再書き込み」しようとしましたか(使用しているオブジェクトの.textプロパティをリセットします)?ビューがデータを再チェックまたは再描画しないだけの場合が多くあり、強制が唯一の修正のようです。ユーザーエクスペリエンスの観点からこれが適切でない場合は、ユーザーがタッチしてから消える前に、ナビゲーション/タブバーを透明にしてみてください。これは通常、ビューを画面全体に拡大します。

0
TahoeWolverine

Interface Builderを使用している場合は、サイズインスペクターで自動サイズ変更が正しく設定されていることを確認してください。コードでUITextViewを作成する場合は、フレームを十分に大きく設定し、ビューの親(およびその親)も十分に大きいことを確認してください。簡単にするために、ビューをウィンドウに直接追加し、そこから内側に移動します。

ビューをスーパービューに移動するには:

- (void)moveViewToSuperview:(UIView *)view
{
    UIView *newSuperview = [[view superview] superview];
    [view removeFromSuperview];
    [newSuperview addSubview:view];
    [newSuperview bringSubviewToFront:view];
}
0
rpetrich

このようなセグエの準備にコードを入れてください、私にとっては完璧に動作します:

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

        }
    }
0
Deco

UITabBarControllerがrootViewController(navigationController)によってプッシュされた場合。以下を試すことができます。

まずステータスバー/タブバーを非表示にします。

[self.navigationController pushViewController:aBlankViewController animated:NO];
[self.navigationController popViewControllerAnimated:NO];

調整中に画面にショックが発生しますが、空白を取り戻すことができるはずです...

0
xingzhi.sg

私は同様の問題を経験しました、この議論は役に立ちました: iPadサイズのUIWebView

Tony の回答は、サブビューを作成するときに次のようなコードを設定すると役立つことを発見するのに役立ちました。

self.tabBarController.tabBar.frame = self.view.bounds;
0
Matt