我在一个简单的应用程序中使用 Split View Controller 。将所有内容保留为默认值就可以了。换句话说,当按下后退按钮时,主视图 Controller 始终以横向显示并以纵向覆盖细节 View Controller 。
我想做的是让主视图 Controller 模拟横向和纵向相同的功能。换句话说,当设备处于横屏状态时,我希望主视图 Controller 隐藏起来,直到我按下后退按钮,然后我希望它覆盖详细 View Controller 。
我认为最好的方法是使用以下代码:
- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController: (UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
return self.bHideMaster;
}
这是因为它在横向模式下隐藏了主视图 Controller 。然后我使用以下代码使其重新出现:
- (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];
}
这几乎奏效了。我有两个问题:
主视图 Controller 从隐藏到取消隐藏和取消隐藏到隐藏的转换不是动画的,而且非常明显。我添加了动画代码(见上文),但它只为细节 View Controller 而不是主视图 Controller 设置动画。 master 会立即出现和消失(在消失时留下一个黑框),直到详细 View Controller 滑过。
这也说明了我的第二个问题。我希望主视图 Controller 在以横向模式出现时与详细 View Controller 重叠,而使详细 View Controller 保持原样。相反,它会调整详细 View Controller 的大小(就像我开始之前在横向模式下所做的一样)。我希望主视图 Controller 以与纵向模式相同的方式进行交互:主视图 Controller 滑入细节 Controller 的顶部,并在选择项目时滑出。
如果我能解决问题 2,那么我就不必担心问题 1。 Split View Controller 中似乎应该有一种方法可以从左侧滑入母版(与详细 View Controller 重叠) ).它以纵向模式执行,因此代码必须存在。我如何在横向模式下调用相同的代码?
谢谢!
--------编辑 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];
}
最佳答案
在 iOS 8.0 中
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden;
隐藏主视图
关于ios - 使隐藏/取消隐藏主视图 Controller 在横向上的工作与纵向相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16352980/