37

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

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

無効な 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];
}

(テキストビューをウェブビューに切り替えましたが、元のテキストビューでも同じことができます)

4

15 に答える 15

31

タブバーとナビゲーションバーをそれぞれ画面の下部と上部からアニメーション化して、タブバーがあった場所に49ピクセルの高さの空白を残して、この正確な問題が発生しました。

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

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

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

次に、サブビューのフレームが480 x 320pxであり、画面全体(以前は不思議な空白だった領域を含む)であることを確認するだけです。

于 2009-07-22T19:21:32.953 に答える
3

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

于 2009-07-20T19:38:48.603 に答える
2

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

scrollViewController.hidesBottomBarWhenPushed = YES;

于 2010-10-03T00:02:23.983 に答える
2

同様の問題がありました。ハリーが言ったように、それは Tab Bar Controller の内部コントローラーである Navigation Controller の理由です。ビューを再描画して正しいフレームを作成する別の方法を見つけました。コントローラーに次を追加します。

- (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;
    }];
}
于 2014-11-12T11:31:54.920 に答える
2

タブバー領域に組み込まれている別のビューがあるのではないでしょうか? つまり、隠すための追加の何かです。これは、周囲にどのようなビューがあるかを確認するのに役立ちます。

for (UIView *viewy in [self.navigationController.view subviews])
{
    NSLog([viewy description]);
}
于 2009-07-19T06:22:06.230 に答える
1

TabBarControllersビューを画面より大きくして、タブバーが画面から非表示になるようにしてください。これを行うと、新しいViewControllerが設定される前に、ビューのサイズが変更されて新しいフレームがいっぱいになります。

私のテストでは、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に設定すると、コントローラーがナビゲーションスタックにプッシュされた場合に、下部のバーが非表示になります。

于 2009-07-20T16:40:34.467 に答える
1

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

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

于 2009-07-20T19:33:59.797 に答える
1

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

于 2009-07-20T14:49:35.823 に答える
0

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

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

self.tabBarController.tabBar.frame = self.view.bounds;
于 2011-08-01T11:42:53.040 に答える
0

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

最初にステータスバー/タブバーを非表示にします;

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

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

于 2010-10-22T15:06:09.977 に答える
0

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

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

- (void)moveViewToSuperview:(UIView *)view
{
    UIView *newSuperview = [[view superview] superview];
    [view removeFromSuperview];
    [newSuperview addSubview:view];
    [newSuperview bringSubviewToFront:view];
}
于 2009-07-19T05:55:02.480 に答える
0

次のようにセグエの準備にコードを入れてください。私にとっては完璧に機能します。

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

        }
    }
于 2011-12-15T01:14:38.690 に答える
0

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

于 2009-07-21T03:31:26.127 に答える
-1

ビューの寸法に余分なスペースを追加して、長方形 CGRectMake(0,0,320,460) の場合は CGRectMake(0,0,320,480) にします...テキストビューを上に置く基礎となるビューと関係がありますが、ディメンションを追加するだけでそれができます

于 2009-07-10T15:29:10.080 に答える