我在一个简单的应用程序中使用拆分视图控制器。将所有内容保留为默认值可以正常工作。换句话说,当按下后退按钮时,主视图控制器总是以横向显示并以纵向覆盖详细视图控制器。
我想做的是让主视图控制器在横向中模仿与纵向相同的功能。换句话说,当设备处于横向状态时,我希望隐藏主视图控制器,直到我点击后退按钮,然后我希望它覆盖细节视图控制器。
我认为最好的方法是使用以下代码:
- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController: (UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
return self.bHideMaster;
}
这样做的原因是它以横向模式隐藏了主视图控制器。然后我使用以下代码使其重新出现:
- (void)hideUnhidePagesController:(id)sender
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.30f];
UISplitViewController* spv = self.splitViewController;
// Change hide to unhide or vica versa
self.bHideMaster= !self.bHideMaster;
// Hide the button if master is visible
if(self.bHideMaster)
{
self.navigationItem.leftBarButtonItem = self.pagesBarButton;
}
else
{
self.navigationItem.leftBarButtonItem = nil;
}
[spv.view setNeedsLayout];
[spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
[[self.splitViewController.viewControllers lastObject] view].frame = self.splitViewController.view.frame;
[UIView commitAnimations];
}
这几乎奏效了。我有两个问题:
从隐藏到取消隐藏和取消隐藏到隐藏主视图控制器的过渡不是动画的,而且很明显。我添加了动画代码(见上文),但它只动画细节视图控制器而不是主视图控制器。主人会立即出现和消失(留下一个黑框消失),直到细节视图控制器滑过。
这也说明了我的第二个问题。我希望主视图控制器在以横向模式出现时与细节视图控制器重叠,使细节视图控制器保持原样。相反,它会调整详细视图控制器的大小(与我开始之前在横向模式下所做的相同)。我希望主视图控制器以与纵向模式相同的方式进行交互:主视图控制器滑入细节控制器的顶部,并在选择项目时滑出。
如果我能解决问题 2,那么我不必担心问题 1。似乎拆分视图控制器中应该有一个方法可以从左侧滑入主视图(与详细视图控制器重叠)。它以纵向模式执行,因此代码必须在那里。如何在横向模式下调用相同的代码?
谢谢!
---------编辑1---------
我已经重构了 hideUnhidePagesController 并且越来越近了。窗口现在覆盖纵向和横向。如果母版在旋转时可见,仍然存在问题。它会变得混乱并颠倒预期的行为。我在做这个工作。这里修改后的代码:
- (void)hideUnhidePagesController:(id)sender
{
// Change hide to unhide or vica versa
self.bMasterIsHidden= !self.bMasterIsHidden;
NSArray *controllers = self.splitViewController.viewControllers;
UIViewController *rootViewController = [controllers objectAtIndex:0];
UIView *rootView = rootViewController.view;
CGRect rootFrame = rootView.frame;
if(self.bMasterIsHidden)
{
rootFrame.origin.x -= rootFrame.size.width;
}
else
{
rootFrame.origin.x += rootFrame.size.width;
}
[UIView beginAnimations:@"hideUnhideView" context:NULL];
rootView.frame = rootFrame;
[UIView commitAnimations];
}