首页 iOS.& Swift Books 通过教程催化剂

12
Barista培训:触摸吧 由Marin Bencevic撰写

你只是成为一个真正的Barista大师的最后一步!您旅途中的最后一个剩余条款是...触摸杆。无论您是爱触控栏还是认为这是一个噱头,很多Mac用户都很严重使用它。因此,支持触摸栏是让您的Catalyst应用程序在摩托斯的家中完全感受的重要一步。

在本章中,您将扩展您正在处理的应用程序,以将一些有用的项目添加到触摸栏中。您将了解这些项目以及如何允许您的用户自定义它们。

但是,在开始之前,让我们谈谈触摸杆如何在引擎盖下工作。

了解触摸杆

使用Mac时,触摸栏根据屏幕上的活动持续更改。与菜单栏类似,触摸栏使用 响应链链 确定要存在的项目。看看第10章,“Barista培训:菜单栏”,了解有关响应链的更多信息。

GIST是每个视图控制器和视图是一个 响应者,其中一个是 急救人员,这是目前主动视图。响应者链像一棵树一样,从第一个响应者向上一直到您的应用程序的根窗口。

响应者链中的每个项目都可以说“这里是我想要的物品在触摸栏中。”当第一个响应者发生变化时,触摸杆上升,按照它拾取物品。当然,并非所有这些项目都适合触控栏,因此触摸杆优先考虑更接近第一个响应者的物品。背部的那些没有显示,并耐心等待转向闪耀。

但是,背部的那些不一定要收回舞台!如果您认为项目或多或少重要,则可以将其优先级设置为更高或更低的值。订购物品时,触摸栏将考虑到此。

The responders suggest their items to the Touch Bar by overriding makeTouchBar. That method returns an ns.TouchBar object. Don’t let the naming confuse you: The Touch Bar — the physical bar — displays multiple instances of ns.TouchBar. In the following screenshot you’ll see four distinct ns.TouchBar instances shown on the Touch Bar:

这是Notes应用程序的触摸栏。酒吧1和4是系统栏,它们总是在那里。栏3是活动文本字段的栏,目前是第一个响应者。 Bar 3欺负并藏起来自栏2的一些物品,因为酒吧2在响应者链中更深。

笔记: Since the Touch Bar is only available on macOS, ns.TouchBar and related APIs are lifted directly from macOS and included in Catalyst, which explains the ns. 字首。这意味着已经存在现有的宏特定触控栏文档和教程通常适用于Catalyst应用程序。

添加项目

现在我们已经,艾哈姆, 触摸了 在某些理论上,您已准备好添加一些新物品!

#if targetEnvironment(macCatalyst)
extension NSTouchBarItem.Identifier {
  static let newEntry =
    NSTouchBarItem.Identifier(
    "com.raywenderlich.Journalyst.addEntry")
}
#endif
#if targetEnvironment(macCatalyst)
override func makeTouchBar() -> NSTouchBar? {
  let bar = NSTouchBar()
  bar.defaultItemIdentifiers = [.newEntry]
  let button = NSButtonTouchBarItem(
    identifier: .newEntry,
    title: "New Entry",
    target: self,
    action: #selector(addEntry))
  bar.templateItems = [button]
  return bar
}
#endif

实施代表

To avoid this memory issue, you’ll implement ns.TouchBarDelegate. Instead of setting the items directly on the bar, you will only give the bar a list of item identifiers. The bar will then ask the delegate for the item only when it’s needed. This is similar to how table views work: Cells are created on-demand instead of being loaded automatically.

let bar = NSTouchBar()
bar.delegate = self
bar.defaultItemIdentifiers = [.newEntry]
return bar
#if targetEnvironment(macCatalyst)
extension RootSplitViewController: NSTouchBarDelegate {
  func touchBar(
  	_ touchBar: NSTouchBar,
  	makeItemForIdentifier identifier: NSTouchBarItem.Identifier)
  	-> NSTouchBarItem? {
  	
    switch identifier {
    case .newEntry:
      let button = NSButtonTouchBarItem(
        identifier: identifier,
        title: "New Entry",
        target: self,
        action: #selector(addEntry))
      return button
    default:
      return nil
    }
  }
}
#endif

分组项目

是时候向触摸栏添加了三个项目:“删除,”“下一个条目”和“上一个条目”。因为所有三个项目都与当前所选条目相关,因为您将把它们所有人放在一个组中,而不是单独添加它们。

static let entryOptions =
  NSTouchBarItem.Identifier(
  "com.raywenderlich.journalyst.entryOptions")
bar.defaultItemIdentifiers = [.newEntry, .entryOptions]
case .entryOptions:
  let next = NSButtonTouchBarItem(
    identifier: .init(identifier.rawValue + ".next"),
    title: "Next Entry",
    target: self,
    action: #selector(goToNext))
  let previous = NSButtonTouchBarItem(
    identifier: .init(identifier.rawValue + ".previous"),
    title: "Previous Entry",
    target: self,
    action: #selector(goToPrevious))
  let delete = NSButtonTouchBarItem(
    identifier: .init(identifier.rawValue + ".delete"),
    title: "Delete",
    target: self,
    action: #selector(removeEntry))
let spacer = NSTouchBarItem(identifier: .fixedSpaceLarge)
let group = NSGroupTouchBarItem(
  identifier: identifier,
  items: [spacer, next, previous, spacer, delete])
return group

bar.principalItemIdentifier = .entryOptions

自定义触摸栏

如果有一件事像我们这样的人喜欢,这是自定义选项。当他们创建触控栏时,苹果清楚地铭记了这一点,因为他们添加了特定于应用程序的触控栏定制。作为开发人员,为此提供支持相对容易。

#if targetEnvironment(macCatalyst)
NSTouchBar.isAutomaticCustomizeTouchBarMenuItemEnabled = true
#endif
extension NSTouchBar.CustomizationIdentifier {
  static let journalyst = NSTouchBar.CustomizationIdentifier(
    "com.raywenderlich.journalyst.main")
}
bar.customizationIdentifier = .journalyst
bar.customizationAllowedItemIdentifiers = [.newEntry, .entryOptions]
button.customizationLabel = "Add a new entry"
group.customizationLabel = "Entry Options"

关键点

  • The Touch Bar is made of ns.TouchBar instances.
  • 触摸杆使用响应者链来确定要显示的项目。
  • Each view and view controller can add items to the Touch Bar by overriding makeTouchBar and returning an ns.TouchBar.
  • Use templateItems only for lightweight items.
  • For other items, implement ns.TouchBarDelegate.
  • 通过启用自定义菜单项,使物品可自定义,并将自定义标签添加到项目中,请允许自定义。

然后去哪儿?

To see some other Touch Bar items in action, check out the ns.TouchBar tutorial written by Andy Pereira, one of the authors of this book: bit.ly/2kxqpjs..

有一个技术问题?想报告一个错误吗? 您可以向官方书籍论坛中的书籍作者提出问题和报告错误 这里.

有反馈分享在线阅读体验吗? 如果您有关于UI,UX,突出显示或我们在线阅读器的其他功能的反馈,您可以将其发送到设计团队,其中表格如下所示:

© 2021 Razeware LLC

您可以免费读取,本章的部分显示为 混淆了 文本。解锁这本书,以及我们整个书籍和视频目录,带有Raywenderlich.com的专业订阅。

现在解锁

要突出或记笔记,您需要在订阅中拥有这本书或自行购买。