对于这个初始实现,我认为 Apple 选择隐藏主工具栏,因为(主)导航控制器不能使用单个工具栏既在屏幕上显示,又在屏幕上滑动(不同项目)。如果您查看 Apple 的 Mail 应用程序,它们的主工具栏会在推送动画期间消失,就像您看到的一样。
有趣的是,他们的日历应用程序在日和事件视图控制器转换之间使用了一个非常好的工具栏 crossFade。如果您查看该动画,您会发现它是两个视图的单个工具栏,而不是在第一个动画上方的第二个工具栏。
虽然UINavigationController 私下支持crossFade,但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)。
不幸的是,折叠拆分视图的辅助(导航)控制器的幕后技巧会影响您的工具栏,因为主导航控制器接管了辅助导航控制器正在处理的内容。
我们所做的只是将辅助工具栏从辅助导航控制器移动到细节视图控制器,因此主导航控制器可以在辅助导航控制器被推送时处理细节视图控制器的工具栏动画。
也许在未来的更新中,拆分视图控制器将能够为故事板的工具栏设置动画,但目前,我知道如何做到这一点的唯一方法是在代码中。