7

在 Big Sur 中,Xcode 和日历的工具栏项目在打开时停留在侧边栏上方,但在侧边栏折叠时在左侧保持可见。

侧边栏打开: 在此处输入图像描述

侧边栏折叠: 在此处输入图像描述

在13:55的“采用 macOS 的新外观”中,John 说“放置在分隔符 [sidebarTrackingSeparator] 之前的项目将出现在全高侧边栏上”,就像它们在 Xcode 和日历中一样。我无法完成这项工作。

这是一个演示该问题的示例项目。我使用了 IB 定义的“带侧边栏的窗口控制器”,并添加了一个工具栏项来切换侧边栏。在 NSWindowController 的子类中,我在项目.sidebarTrackingSeparator之后插入.toggleSidebar

override func windowDidLoad() {
    // Sometimes the toolbar items aren't loaded yet--async is a quick and dirty way to prevent a crash
    DispatchQueue.main.async {
        self.window?.toolbar?.insertItem(withItemIdentifier: .sidebarTrackingSeparator, at: 1)
    }
}

有时这不起作用(切换按钮保留在侧边栏的右侧)。有时侧边栏切换会放在溢出菜单中:

在此处输入图像描述

我还没有看到任何关于在 WWDC 会议之外实现此工具栏设计的讨论。有没有人能让这个工作?

4

1 回答 1

7

这是一个 IB/代码时序分歧。Interface Builder 在添加工具栏项之前配置和安装工具.sidebarTrackingSeparator栏。

所以你在做正确的事,只是为时已晚。并且太晚了调度。我认为重要的是在窗口上设置工具栏之前将项目放在那里。

不幸的是,这对于 IB 来说是不可能的,除非我相信,你创建一个全新的工具栏并重新分配它。但这是一个坏主意,因为这样您可能会遇到自动保存工具栏状态的麻烦。

诀窍是在 Interface Builder 中配置分隔符。如果您查看此常量的 ObjC 文档,您会看到更长的名称:NSToolbarSidebarTrackingSeparatorItemIdentifier

我们在这里能做的最好的事情是希望符号的名称与标识符的值相同。如果你真的想验证这一点,你可以在调试器中打印符号的值:

(lldb) po NSToolbarSidebarTrackingSeparatorItemIdentifier
NSToolbarSidebarTrackingSeparatorItemIdentifier

如果我们在 IB 中创建一个自定义工具栏项,并根据 John 的视频添加它...

带有位于工具栏中的自定义工具栏项目的界面生成器。 该项目在属性检查器中设置了标识符 NSToolbarSidebarTrackingSeparatorItemIdentifier

低,看: 在此处输入图像描述

于 2020-09-22T04:38:21.063 回答