问题在于水平紧凑的大小类,其中UISplitViewController将详细视图控制器推送到堆栈(如UINavigationController),工具栏在显示细节时消失,并在细节完全弹出后重新出现(见下文).我想让工具栏保持原样,就像使用普通的导航控制器一样.
示例项目已上传here.
解决方法
有趣的是,他们的日历应用程序在白天和事件视图控制器转换之间使用了非常好的工具栏crossFade.如果您查看该动画,您可以看到它是两个视图的单个工具栏,而不是在第一个动画上方设置动画的第二个工具栏.
尽管UINavigationController私有支持crossFade,但Apple不会为此特定视图控制器动画启用它. _shouldCrossFadeBottomBars返回NO,并且没有delegateShouldCrossFadeBottomBars导航控制器标志的setter.
我将提交一个错误报告以及一个增强请求,以支持统一故事板UISplitViewController的底栏动画.我相信Apple将改进iPhone的分割视图控制器功能.
在此期间,您可以通过隐藏主导航控制器的工具栏并将工具栏添加到主视图控制器的故事板来处理此问题.这将允许主视图控制器自己的工具栏在屏幕上,而详细视图控制器的工具栏项目将滑入.
这将涉及将master的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).
不幸的是,幕后崩溃拆分视图的辅助(导航)控制器的技巧会影响您的工具栏,因为主导航控制器接管了辅助导航控制器正在处理的内容.
我们所做的就是将辅助工具栏从辅助导航控制器移动到细节视图控制器,这样主导航控制器可以在推动辅助导航控制器时处理细节视图控制器的工具栏动画.
也许在未来的更新中,拆分视图控制器将能够为故事板的工具栏设置动画,但就目前而言,我知道如何操作的唯一方法是在代码中.