我正在使用一个使用
UISplitViewController
作为窗口根的应用程序。我希望主视图控制器和详细视图控制器都是 UITableViewController
内的 UINavigationController
,并且 UIToolbar
可见。在水平常规尺寸宽度中,效果很好,如图所示:
问题出在水平紧凑尺寸类中,其中
UISplitViewController
将细节视图控制器像UINavigationController
一样推入堆栈,工具栏在显示细节时消失,并在细节完全弹出后重新出现(见下文)。我希望工具栏保持在原位,就像使用普通导航控制器一样。
示例项目已上传此处。
对于这个初始实现,我认为苹果选择隐藏主工具栏,因为(主)导航控制器不能使用单个工具栏既在屏幕上显示,又在屏幕上滑动(不同的项目)。如果您查看 Apple 的邮件应用程序,它们的主工具栏会在推送动画期间消失,就像您所看到的那样。
有趣的是,他们的日历应用程序在日和事件视图控制器转换之间使用了一个非常好的工具栏交叉淡入淡出。如果您查看该动画,您会发现它是两个视图的单个工具栏,而不是在第一个工具栏上方显示第二个工具栏。
虽然 crossFade 是由
UINavigationController
私人支持的,但 Apple 并未为此特定的视图控制器动画启用它。 _shouldCrossFadeBottomBars
返回 NO,并且 delegateShouldCrossFadeBottomBars
导航控制器标志没有设置器。
我会提交一份错误报告以及一个增强请求,以支持统一故事板的底部栏动画
UISplitViewController
。我相信苹果会改进 iPhone 的分屏视图控制器功能。
同时,您可以通过隐藏主导航控制器的工具栏来处理此问题,并将工具栏添加到主视图控制器的情节提要中。这将允许主视图控制器自己的工具栏显示在屏幕上,而详细视图控制器的工具栏项目会滑入。
这将涉及将您主人的
UITableViewController
更改为 UIViewController
。添加 UIToolbar
和约束。对于表格,您可以放入 UITableView
,或使用容器视图并将其连接到您的 UITableviewController
。
在
DetailViewController
中设置详细视图的工具栏。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] init ...];
self.toolbarItems = @[barButtonItem];
[self configureView];
}
导航控制器将在视图出现之前设置工具栏项目(在视图加载之后),并且工具栏将与详细视图一起推送到屏幕上。
如果您好奇,这就是我所理解的水平紧凑尺寸类别的详细视图工具栏的情况。它是辅助导航控制器,而不是详细视图控制器,被推送到主导航控制器堆栈上。主导航控制器从辅助导航控制器获取其装饰,以及属于其可见(详细)视图控制器的 navigationItems
(和
toolbarItems
)。不幸的是,折叠分割视图的辅助(导航)控制器的幕后技巧会影响您的工具栏,因为主导航控制器接管了辅助导航控制器正在处理的内容。
我们所做的就是将辅助工具栏从辅助导航控制器移动到详细视图控制器,这样主导航控制器就可以在辅助导航控制器被推动时处理详细视图控制器的工具栏动画。
也许在未来的更新中,分割视图控制器将能够为故事板的工具栏设置动画,但目前,我知道如何做到这一点的唯一方法是使用代码。
self.navigationController?.setToolbarHidden(false, animated: true)
当然,您可以删除默认的表视图控制器并使用其中包含表视图的标准视图控制器并添加工具栏,那么您就不会遇到问题。它确实破坏了一行代码,因为它不再位于表视图控制器中,并且标准导航控制器不支持clearsSelectionOnViewWillAppear。
tableView.clearsSelectionOnViewWillAppear = self.splitViewController!.collapsed
您可以通过将此代码添加到您的 viewWillAppear 来解决该问题...
if let indexPath = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
UINavigationController *secondaryNavigationController = [[UINavigationController alloc] initWithRootViewController:tableViewController];
[secondaryNavigationController setToolbarHidden:NO animated:NO];
[self showDetailViewController:secondaryNavigationController sender:nil];
self
是一个子类化的 UISplitViewController。
按下辅助(详细)视图控制器时,附加到主视图控制器的工具栏保持在原来的位置,然后淡出。弹出辅助视图控制器时,附加到主视图控制器的工具栏会淡入。