Touch 不带 Bar

苹果在2016年推出了新的Macbook pro,随之也带来了新的特性,比如Type-C,Touch Id,当然还有 让人争议的TouchBar。

Touch Bar
那么Touch Bar 是什么?

TouchBar 不只是一个触摸工具条,也是Mac的第二块屏幕,能够提供一些简单便捷的交互。那么为什么不做把屏幕直接做成触控的呢?一方面苹果认为做全触控屏没有必要,另一方面,它又认为在某些情况下,需要触控便捷操作,于是在这两种思路的纠结就做出了 Touch Bar 。这样一个可以触控但又没有必要在屏幕上触控的东西。苹果是将 Touch Bar 作为 Mac 屏幕的一个延伸,以及不能 Mac 屏幕不能触控的一个补充,现在通过这个触控条 Mac 也能触控了。

开发一个有Touch Bar 的应用

不是只有带有Touch Bar 的新Macbook pro 才能开发Touch Bar 功能。我们只需要通过 Xcode 的菜单window -- Show Touch Bar 就可以打开Touch Bar 的模拟器。

Touch 不带 Bar_第1张图片
打开TouchBar 模拟器
Touch Bar 模拟器

下面我们先通过Xcode 创建一个新的macos 应用,默认使用 Storyboards。

Touch 不带 Bar_第2张图片
Paste_Image.png

官方文档中说实现Touch Bar 必须遵循下面3点,并且给出了实现协议的代码模板。

Touch 不带 Bar_第3张图片
Paste_Image.png

Touch Bar 的使用非常简单,我们先在ViewController 加入以下代码:

import Cocoa

class ViewController: NSViewController, NSTouchBarDelegate {

    @IBOutlet weak var test: NSPopUpButton!
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override var representedObject: Any? {
        didSet {
        }
    }

    @available(OSX 10.12.2, *)
    override func makeTouchBar() -> NSTouchBar? {
        let touchBar = NSTouchBar()
        touchBar.delegate = self
        // 2
        touchBar.customizationIdentifier = .touchBar
        // 3
        touchBar.defaultItemIdentifiers = [.myBarItem, .fixedSpaceSmall]
        // 4
        touchBar.customizationAllowedItemIdentifiers = [.myBarItem, .fixedSpaceSmall]
        return touchBar
    }

    @available(OSX 10.12.2, *)
    func touchBar(_ touchBar: NSTouchBar, makeItemForIdentifier identifier: NSTouchBarItemIdentifier) -> NSTouchBarItem? {
        var title = ""
        switch identifier {
        case NSTouchBarItemIdentifier.myBarItem:
            title = "myTouchBarItem"
        default:
            title = ""
        }

        let touchbarItem = NSCustomTouchBarItem(identifier: identifier)
        let button = NSButton(title: title, target: self, action: #selector(touchBarAction))
        touchbarItem.view = button
        return touchbarItem
    }

    func touchBarAction() -> Void {
        print("clicked")
    }
}

extension NSTouchBarCustomizationIdentifier {
    static let touchBar = NSTouchBarCustomizationIdentifier("myTouchBar")
}

extension NSTouchBarItemIdentifier {
    static let myBarItem = NSTouchBarItemIdentifier("myBarItem")
}

运行,发现并没有什么反应。

下面我们需要创建一个WindowController,然后在StoryBoard 中 与WindowController创建关联,然后再重新覆盖 makeTouchBar 方法对ViewController 的进行调用。

class WindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()
    }

    @available(OSX 10.12.2, *)
    override func makeTouchBar() -> NSTouchBar? {
        guard let viewController = contentViewController as? ViewController else {
            return nil
        }
        return viewController.makeTouchBar()
    }
}

运行,成功显示。

Paste_Image.png

上面是通过代码创建TouchBar 的方式,我们也可以通过StoryBoard 的方式直接将TouchBar 拖拽至ViewController 中,并且更简单,跟其他组件的使用基本一致。理论上 TouchBar 中可以添加任何你想添加的东西,但苹果说,Touch Bar依然只是一种辅助输入设备,而并不是MacBook Pro的“副显示屏”.

用户可以在观看Touch Bar后进行控制,但是用户的主要目光仍然需要停留在主屏幕上。Touch Bar不能用来显示警报、提醒、消息、混动内容、静态内容或任何其它能够吸引用户注意力而让用户将视线从屏幕上转移下来的功能。

你可能感兴趣的:(Touch 不带 Bar)