【问题标题】:iOS8 UIToolbar disappearing when showing detail view controller显示详细视图控制器时iOS8 UIToolbar消失
【发布时间】:2014-10-13 18:31:36
【问题描述】:

我正在使用UISplitViewController 作为窗口根的应用程序。我希望主视图控制器和详细视图控制器都成为UINavigationController 内的UITableViewControllerUIToolbar 可见。在水平常规尺寸宽度中,这可以正常工作,如图所示:

问题出在一个水平紧凑的尺寸类中,其中UISplitViewController 将详细视图控制器推入堆栈,如UINavigationController,工具栏在显示详细信息时消失,并在详细信息完全显示后重新出现弹出(见下文)。我希望工具栏与普通导航控制器一样保持原位。

已上传示例项目here

【问题讨论】:

  • 添加许多行并向下滚动然后选择 - 故障更严重,所选行向下移动整个工具栏高度。

标签: storyboard ios8 uisplitviewcontroller uitoolbar


【解决方案1】:

对于这个初始实现,我认为 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)。

不幸的是,折叠拆分视图的辅助(导航)控制器的幕后技巧会影响您的工具栏,因为主导航控制器接管了辅助导航控制器正在处理的内容。

我们所做的只是将辅助工具栏从辅助导航控制器移动到细节视图控制器,因此主导航控制器可以在辅助导航控制器被推送时处理细节视图控制器的工具栏动画。

也许在未来的更新中,拆分视图控制器将能够为故事板的工具栏设置动画,但目前,我知道如何做到这一点的唯一方法是在代码中。

【讨论】:

  • 很好的解释;清晰,深刻。 “被推送到主导航控制器堆栈的是辅助导航控制器,而不是详细视图控制器。”正确的。我对此发表了评论,对它完全有效,有些惊讶,在这里:devforums.apple.com/message/1056959#1056959 Apple 内部人员的有用回复。
  • 也许吧,但我必须回去弄清楚。现在我只想通过初稿!如果你知道怎么做,也许你可以在 github 上创建一个示例项目,我可以从中窃取......? :)
  • 哇。这当然是文档遗漏。他们可能在几个与改编相关的 WWDC 2014 视频中提到了这一点......!当然他们也从来没有说过这件事,但事实证明这是至关重要的:stackoverflow.com/a/26591842/341994
  • Peter - 我想将此信息添加为导航控制器章节中的注释。你想被记名吗?
  • 答案中列出的解决方案是否真的解决了UIToolbar消失的问题?在我的测试中没有。
【解决方案2】:

如果您需要在不更改默认视图控制器的情况下使用主从应用程序,并且您可以在推送到详细视图控制器时工具栏消失...您可以将以下代码行添加到主视图控制器在 viewWillAppear 中,这样当它弹出时工具栏在 segue 期间就在那里,而不是等到 segue 完成后才出现。

self.navigationController?.setToolbarHidden(false, animated: true)

当然,您可以删除默认的 Table View Controller 并使用带有 table view 的标准 View Controller 并添加工具栏,那么您就没有问题了。它确实破坏了一行代码,因为它不再位于表视图控制器中,并且标准导航控制器不支持 clearsSelectionOnViewWillAppear。

tableView.clearsSelectionOnViewWillAppear = self.splitViewController!.collapsed

您可以通过将此代码添加到您的 viewWillAppear 来解决此问题...

        if let indexPath = tableView.indexPathForSelectedRow {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }

【讨论】:

  • 仅供参考,表格视图控制器的功能远不止清除选择,而且很明显,它是一个交互式动画,而不是简单的取消选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多