1

こんにちは私はsplitViewControllerを持っています

mapViewController = [[MapViewController alloc] initWithManagedObjectContext:managedObjectContext startingRegion:startingRegion];

    distanceViewController = [[DistanceTableViewController alloc] initWithManagedObjectContext:managedObjectContext];
    distanceViewController.mapViewController = mapViewController;
    setupViewController = [[SetupTableViewController alloc] initWithStyle:UITableViewStyleGrouped map:mapViewController.map];   
    setupViewController.positionSwitch.on = savePosition;

    SearchTableViewController *searchViewController = [[SearchTableViewController alloc]  initWithStyle:UITableViewStylePlain managedObjectContext:managedObjectContext];   
    searchViewController.mapViewController = mapViewController;

    tabBarController = [[UITabBarController alloc] init];

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        UINavigationController *mapNavigationController = [[[UINavigationController alloc] initWithRootViewController:mapViewController] autorelease];
        UINavigationController *searchNavigationController = [[[UINavigationController alloc] initWithRootViewController:searchViewController] autorelease];
        UINavigationController *distanceNavigationController = [[[UINavigationController alloc] initWithRootViewController:distanceViewController] autorelease];
        UINavigationController *setupNavigationController = [[[UINavigationController alloc] initWithRootViewController:setupViewController] autorelease];

        UISplitViewController* splitVC = [[UISplitViewController alloc] init];
        splitVC.viewControllers = [NSArray arrayWithObjects:searchNavigationController, mapNavigationController, nil];
        splitVC.title = @"iMetano";
        splitVC.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Mappa" image:[UIImage imageNamed:@"mapIcon2.png"] tag:0] autorelease];

        NSArray *viewControllersArray = [NSArray arrayWithObjects: splitVC,setupNavigationController,nil];
        [splitVC release];

        tabBarController.viewControllers = viewControllersArray;
    }

アプリを縦向きで起動すると、すべて正常に動作します。

アプリをランドスケープで起動すると、これが結果になります

代替テキスト

  1. UINavigationController とステータスバーの間にいくつかのピクセルがある最初の viewController SearchTableViewController のビューのみが表示されます
  2. 縦向きに回転し、横向きに戻った後、両方のviewControllerのビューが表示されますが、2番目にはstatusBarとUINavigationControllorの間にピクセルがあります

理由がわかりません。

4

4 に答える 4

1

Apple は、タブ バー コントローラーのように、分割ビュー コントローラーを他のものに配置しないように言っています。

于 2010-10-12T19:16:35.670 に答える
0

私のコードとIBを何度も見た後。これは私が思いつくことができる最高のものです。最適かどうかはわかりませんが、私にとってはうまくいきます。デフォルトの詳細ビュー コントローラを読み込んでいます。コントローラーをviewDidLoadに直接ロードすると、問題が発生します。セレクターからロードすると、問題はなくなります。これが役立つことを願っています。このコードは RootViewController にあります。

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self performSelector:@selector(loadController) withObject:nil afterDelay:0];
    }

    -(void)loadController{
    UIViewController <SubstitutableDetailViewController> *detailViewController = nil;
    WebViewController *newDetailViewController = [[WebViewController alloc] initWithNibName:@"WebViewController" bundle:nil];
    [newDetailViewController setTitle:@"Home"];
    NewNavController <SubstitutableDetailViewController>*navController = [[NewNavController alloc] initWithRootViewController:newDetailViewController];

    detailViewController = navController;

    NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
    splitViewController.viewControllers = viewControllers;


}
于 2010-07-20T06:20:18.517 に答える
0

タブバー、分割ビュー、およびナビゲーションコントローラーを組み合わせようとしたときに、まったく同じ問題が発生しました。アプリケーションが最初に起動し、最初のタブがタブ バー コントローラーのビュー コントローラーの配列の最初のタブであるため、最初のタブが自動選択されたときにのみ配置ギャップが存在することに気付きました。タブを切り替えた後、分割ビューでナビ コントローラーの位置がずれているタブに戻った後、位置合わせの問題は発生しませんでした。したがって、この動作を複製して、画面が最初にレンダリングされるときにずれを取り除くために、次のように追加しました。

[tabBarController setSelectedViewController:splitVC];

タブバーコントローラーにView Controller配列を設定した直後。今ではチャンピオンのように機能します。

于 2010-08-29T10:02:28.587 に答える
0

これは古い質問であることは知っていますが、私のようなナビゲーション階層を持っている人のために、この問題を回避するために使用したハックを次に示します。

UITabBarController
    Tab0->UINavigationController->MGSplitViewController _or_ UISplitViewController
    Tab1->UINavigationController->SomeOtherViewController
    Tab2->Etc...

デバイスの向きがUIInterfaceOrientationPortrait以外の場合、起動時に1回だけ発生する20pxのギャップを取り除くことはできませんでした。20px のギャップは、上記の分割ビューの UINavigationController の UINavigationBar がゼロ以外の origin.y 値を持つために発生します。ほとんどの場合、20 であることがわかります。

また、これはデバイスが iOS 5.0 未満を実行している場合にのみ問題になることがわかりました。

MGSplitViewController のビュー コントローラ コードでこの問題をチェックします (つまり、self = MGSplitViewController):

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    if(self.doIOS4OneTimeRotationHack == YES)
    {
        self.doIOS4OneTimeRotationHack = NO;
        for(UINavigationController *navController in [self viewControllers])
        {
            if(navController.navigationBar.frame.origin.y != 0.0f)
            {
                [UIView animateWithDuration:0.01
                                      delay:0.0
                                    options:UIViewAnimationOptionCurveEaseOut
                                 animations:
                 ^(void)
                 {
                     navController.navigationBar.frame = CGRectMake(navController.navigationBar.frame.origin.x,0.0f, navController.navigationBar.frame.size.width,navController.navigationBar.frame.size.height);
                 }
                                 completion:
                 ^(BOOL finished)
                 {
                     //NSLog(@"Shifted navbar 0x%x up!",navController.navigationBar);
                 }];
            }
        }
    }
}

アニメーションはわずか 0.01 秒で終了するように設定されているため、起動時のスプラッシュ スクリーンが消えて MGSplitViewController ビューがその場所に表示されるので、アニメーションが非常に高速に発生することに気付くことさえありません。多分それをいじって、それを瞬時にします。私はそれを機能させて次のタスクに移らなければならなかったので、それ以降はだまされませんでした。

このようなハックに頼るのは好きではありませんが、これがこの問題を回避できる唯一の方法でした。以下のScottSのソリューションは素晴らしいように聞こえましたが、残念ながら私にはうまくいきませんでした.

于 2012-06-12T23:50:48.347 に答える