Iphone UISplitViewController异常行为
嗨,我有一个splitViewControllerIphone UISplitViewController异常行为,iphone,uikit,uiviewcontroller,uisplitviewcontroller,Iphone,Uikit,Uiviewcontroller,Uisplitviewcontroller,嗨,我有一个splitViewController mapViewController = [[MapViewController alloc] initWithManagedObjectContext:managedObjectContext startingRegion:startingRegion]; distanceViewController = [[DistanceTableViewController alloc] initWithManagedObjectContext
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;
}
当我在肖像中启动应用程序时,一切正常
当我在景观中启动我的应用程序时,这就是结果
我不明白为什么。在一次又一次地看了我的代码和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间隙是由