Iphone UISplitViewController异常行为

Iphone UISplitViewController异常行为,iphone,uikit,uiviewcontroller,uisplitviewcontroller,Iphone,Uikit,Uiviewcontroller,Uisplitviewcontroller,嗨,我有一个splitViewController mapViewController = [[MapViewController alloc] initWithManagedObjectContext:managedObjectContext startingRegion:startingRegion]; distanceViewController = [[DistanceTableViewController alloc] initWithManagedObjectContext

嗨,我有一个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;
    }
当我在肖像中启动应用程序时,一切正常

当我在景观中启动我的应用程序时,这就是结果

  • 我只看到第一个viewController SearchTableViewController的视图,在UINavigationController和状态栏之间有一些像素
  • 当我在纵向旋转和在横向返回后,我看到两个viewController的视图,但第二个在状态栏和UINavigationController之间有一些像素

  • 我不明白为什么。

    在一次又一次地看了我的代码和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;
    
    
    }
    
    -(void)viewDidLoad{
    [超级视图下载];
    [自执行选择器:@选择器(loadController),对象:nil afterDelay:0];
    }
    -(void)loadController{
    UIViewController*detailViewController=nil;
    WebViewController*newDetailViewController=[[WebViewController alloc]initWithNibName:@“WebViewController”捆绑包:nil];
    [newDetailViewController设置标题:@“主页”];
    NewNavController*navController=[[NewNavController alloc]initWithRootViewController:newDetailViewController];
    detailViewController=navController;
    NSArray*viewControllers=[[NSArray alloc]initWithObjects:self.navigationController,detailViewController,nil];
    splitViewController.viewControllers=viewControllers;
    }
    
    在反复查看我的代码和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;
    
    
    }
    
    -(void)viewDidLoad{
    [超级视图下载];
    [自执行选择器:@选择器(loadController),对象:nil afterDelay:0];
    }
    -(void)loadController{
    UIViewController*detailViewController=nil;
    WebViewController*newDetailViewController=[[WebViewController alloc]initWithNibName:@“WebViewController”捆绑包:nil];
    [newDetailViewController设置标题:@“主页”];
    NewNavController*navController=[[NewNavController alloc]initWithRootViewController:newDetailViewController];
    detailViewController=navController;
    NSArray*viewControllers=[[NSArray alloc]initWithObjects:self.navigationController,detailViewController,nil];
    splitViewController.viewControllers=viewControllers;
    }
    
    我在尝试组合选项卡栏、拆分视图和导航控制器时遇到了完全相同的问题。我注意到,对齐间隙仅在应用程序首次启动时出现,并且第一个选项卡是自动选择的,因为它是选项卡栏控制器的视图控制器阵列中的第一个选项卡。在切换选项卡,然后返回到分裂视图中导航控制器未对齐的选项卡后,不存在对齐问题。因此,为了复制此行为并在首次渲染屏幕时消除错位,我添加了:

    [tabBarController setSelectedViewController:splitVC];
    

    在选项卡栏控制器上设置视图控制器阵列之后。现在工作起来像个冠军。

    我在尝试组合选项卡栏、拆分视图和导航控制器时遇到了完全相同的问题。我注意到,对齐间隙仅在应用程序首次启动时出现,并且第一个选项卡是自动选择的,因为它是选项卡栏控制器的视图控制器阵列中的第一个选项卡。在切换选项卡,然后返回到分裂视图中导航控制器未对齐的选项卡后,不存在对齐问题。因此,为了复制此行为并在首次渲染屏幕时消除错位,我添加了:

    [tabBarController setSelectedViewController:splitVC];
    

    在选项卡栏控制器上设置视图控制器阵列之后。现在就像一个冠军一样工作。

    苹果说不要把分割视图控制器放在其他东西里面,比如标签栏控制器

    苹果说不要把分割视图控制器放在其他东西里面,比如标签栏控制器

    我知道这是一个老问题,但是,对于像我这样拥有导航层次结构的人来说,我刚才使用了一种破解方法来解决这个问题:

    UITabBarController
        Tab0->UINavigationController->MGSplitViewController _or_ UISplitViewController
        Tab1->UINavigationController->SomeOtherViewController
        Tab2->Etc...
    
    如果设备方向不是UIInterfaceOrientationPicture,那么我尝试的任何方法都无法消除开机时仅出现一次的20px间隙。20px间隙是由上面分割视图的UINavigationController的UINavigationBar具有非零原点.y值引起的;最有可能的是,你会发现它是20

    此外,我还发现,只有当设备运行的是iOS<5.0时,这才是一个问题

    我在MGSplitViewController的视图控制器代码中检查此问题(即self=MGSplitViewController):

    动画设置为仅在0.01秒内完成,它发生得如此之快,以至于当启动启动屏幕消失且MGSplitViewController视图显示在其位置时,您甚至不会注意到它。也许玩弄它,让它瞬间消失;我必须让它工作起来,然后继续我的下一个任务,所以我没有在这一点上愚弄它


    我不喜欢诉诸这样的黑客手段,但这是我唯一能够绕过这个问题的方法。下面ScottS的解决方案听起来不错,但不幸的是对我来说不起作用。

    我知道这是一个老问题,但对于像我这样拥有导航层次结构的人,我只是用以下方法来解决这个问题:

    UITabBarController
        Tab0->UINavigationController->MGSplitViewController _or_ UISplitViewController
        Tab1->UINavigationController->SomeOtherViewController
        Tab2->Etc...
    
    如果设备方向不是UIInterfaceOrientationPicture,那么我尝试的任何方法都无法消除开机时仅出现一次的20px间隙。20px间隙是由