侧栏中的 Big Sur 工具栏项目

smr*_*smr 7 macos appkit nstoolbar nstoolbaritem macos-big-sur

在 Big Sur 中,Xcode 和 Calendar 的工具栏项目在打开时保留在侧边栏上,但在侧边栏折叠时在左侧仍然可见。

侧边栏打开: 在此处输入图片说明

侧边栏折叠: 在此处输入图片说明

在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)
    }
}

Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

nte*_*iss 7

这是 IB/Code 时间不一致。Interface Builder 在您添加.sidebarTrackingSeparator工具栏项之前配置并安装工具栏。

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

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

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

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

(lldb) po NSToolbarSidebarTrackingSeparatorItemIdentifier
NSToolbarSidebarTrackingSeparatorItemIdentifier
Run Code Online (Sandbox Code Playgroud)

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

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

低下看: 在此处输入图片说明

  • 添加@nteissler的答案,系统自动将侧边栏项目放置在侧边栏分隔线的右侧(以从左到右的语言)。要将其像其他项目一样放在侧边栏中,您可以使用相同的 SF 符号 (sidebar.leading) 创建自定义项目,并使用“NSSplitViewController.toggleSidebar”作为其操作。从 macOS 11.2.2 开始运行 (4认同)
  • 使用 NSToolbarDelegate 是一种替代方法 (2认同)