我正在构建我的第一个 iPad 应用程序。我的要求之一是处理 UISplitviewcontroller 和 UINavigationController。
我们建议的视图层次结构是
(LoginView) ->UINavigationView(LandingView + CollectionView)->UISplitViewcontroller(DetailsView)。
我们的应用程序仅支持横向模式
,我指的是这个SO Question(以及 GILT 应用程序),作为一个新手,我很难根据该描述完成它。
所以我的问题是
1)我怎样才能实现同样的事情,如果有人可以提供小代码片段或参考教程
2)根据 Apples HIG,UISplitviewcontroller 应该是 rootviewcontroller,如果不是。苹果会拒绝我的应用程序吗?(显然 GILT 组已获批准)
3)我发现MGSplitViewController,我可以不作为 root 使用那个吗?
任何帮助,将不胜感激。作为一个新手,我希望我的问题是真实的
5 回答
如果你想使用开箱即用的 splitView 它必须是 root;这里的任何胡说八道都会违反苹果的指导方针或表现出非常奇怪的行为。
MGSplitViewController是 SplitViewController 的完全自定义实现。如果您需要那种东西,它非常好,但其中一些功能是基于我们的应用程序将定向的事实。
或者,您可以自己制作。我已经不止一次这样做了,而且比听起来容易。
(LoginView)->UINavigationView(LandingView + CollectionView)->UISplitViewcontroller(DetailsView)。
基于开箱即用的 UISplitView,我建议:
使 splitView 成为根视图。
应用程序启动后立即弹出(非动画)全屏模式,并允许用户在其中导航 loginView、LandingView 和 collectView;我还建议在这里使用 navController。
一旦用户准备好继续使用 splitView,请使用您想要的任何内容填充 splitView 的 rootView Controller 和 DetailViewController,然后为 Modal 设置动画。
戴夫确实有一点,但我会从您正在从用户那里删除方向选择的角度来看它;删除标准选择(如支持的方向),因为设计人员假设某些配置更有效只会惹恼一些用户。
我通过在我的方法中做到这一点detailViewController
:
-(void)popHomeScreen:(BOOL)animated//OPENS THE HOMESCREEN IN A MODAL DISPLAY
{
firstRun=NO;
//myViewControllerForPopOver init here
myViewControllerForPopOver.modalPresentationStyle = UIModalPresentationFullScreen;
myViewControllerForPopOver.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;//simple anime
if (animated) [self presentModalViewController:myViewControllerForPopOver animated:YES];
else [self presentModalViewController:myViewControllerForPopOver animated:NO];
}
然后在detailViewControllers
ViewDidAppear
方法中调用它:
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(firstRun)[self popHomeScreen:NO];
}
//YOU WILL ALSO NEED TO MAKE 'firstRun=YES' in viewDidLoad
//firstRun is a BOOL
至于根消失(留下一个大的黑色空间)..那是一个已知的错误。尽管我想了一会儿,这是由于在/就在它要自己绘制之前订购动画引起的。
此外,我发现如果我在 splitView 上弹出一个全屏模式,然后在它之后快速弹出另一个基于表单的模式(例如),则全屏模式没有正确绘制。
SplitViews 就像你的岳母,你并不真正喜欢它们,当你必须使用它们时,你必须小心翼翼地绕过地雷。
试试这个,它对我有用
1)在应用程序委托的 didFinishLaunchingWithOptions 使您的登录视图成为根视图
self.window.rootViewController = self.loginViewController;
另外,像模板一样初始化拆分视图(但不添加到self.window)
MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController_iPad" bundle:nil] autorelease];
UINavigationController *masterNavigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
DetailViewController *detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil] autorelease];
UINavigationController *detailNavigationController = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];
self.splitViewController = [[[UISplitViewController alloc] init] autorelease];
self.splitViewController.delegate = detailViewController;
self.splitViewController.viewControllers = [NSArray arrayWithObjects:masterNavigationController ,detailNavigationController, nil];
2)在应用程序的委托中添加一个交换视图控制器,它将根视图交换到拆分视图控制器。
-(void)swapToViewControllers:(RootViewControllerType)viewType
self.window.rootViewController = self.splitViewController;
3) 在您的登录视图中调用 swapToViewControllers。
请记住,HIG 强烈鼓励您支持所有方向。除非您有非常非常好的理由只支持横向,否则您可能会被拒绝。
请参阅 HIG 第 19 页:http: //developer.apple.com/library/ios/documentation/General/Conceptual/iPadHIG/iPadHIG.pdf
用故事板修改了 Ryan CY 的版本。
将此代码放入登录控制器。
1、设置UISplitViewController的storyboard id为SplitViewController;
2.设置UISplitViewController委托并保存实例
UISplitViewController* splitController = [self.storyboard instantiateViewControllerWithIdentifier:@"SplitViewController"];
UINavigationController* navigationController = [splitController.viewControllers lastObject];
splitController.delegate = (id)navigationController.topViewController;
3.登录后更改rootViewController
self.view.window.rootViewController = splitController;