26

我对 Apple Watch 引入的新用户交互可能性感到非常兴奋,其中包括 Force Touch 和 Digital Crown。

但是,我在 WatchKit API 中找不到它们的提及。有什么方法可以接收来自 Force Touch / Digital Crown 的事件?是否可以为事件提供自定义处理程序?

4

5 回答 5

14

watchOS 3 添加WKCrownSequencerWKCrownDelegate报告数字表冠的状态(例如旋转速度),以及在用户旋转表冠时接收通知。

您可以使用冠音序器提供通用输入来控制场景或界面对象。

Apple 已更新其WatchKit 目录示例代码,以包含一个 WKInterfaceController 表冠序列器示例,演示如何使用 Apple Watch 数字表冠与其他对象进行交互:

class CrownDetailController: WKInterfaceController, WKCrownDelegate {
    @IBOutlet var velocityLabel: WKInterfaceLabel!
    @IBOutlet var stateLabel: WKInterfaceLabel!
    @IBOutlet var pickerView: WKInterfacePicker!

    override func awake(withContext context: AnyObject?) {
        super.awake(withContext: context)

        let itemList: [(String, String)] = [
            ("Item 1", "Red"),
            ("Item 2", "Green"),
            ("Item 3", "Blue")
        ]
        let pickerItems: [WKPickerItem] = itemList.map {
            let pickerItem = WKPickerItem()
            pickerItem.caption = $0.0
            pickerItem.title = $0.1
            return pickerItem
        }
        pickerView.setItems(pickerItems)

        crownSequencer.delegate = self
    }

    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
        crownSequencer.focus()
    }

    @IBAction func focusCrown(sender: AnyObject) {
        crownSequencer.focus()
    }

    func updateCrownLabels() {
        velocityLabel.setText(String(format: "RPS: %2.2lf", crownSequencer.rotationsPerSecond))
        stateLabel.setText(crownSequencer.isIdle ? "Idle: true" : "Idle: false")
    }

    func crownDidBecomeIdle(_ crownSequencer: WKCrownSequencer?) {
        updateCrownLabels()
    }

    func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double) {
        updateCrownLabels()
    }

}
于 2016-06-13T23:33:18.063 回答
12

目前(Xcode 6.2 beta 3) Apple 已经表示 Digital Crown 会在第三方应用中上下滚动页面内容,但应用无法注册接收来自它的通知或将其用作输入设备。考虑到第三方代码仅在 iPhone 上的 WatchKit 应用程序扩展中运行,因此这些事件必须以无线方式发送,这似乎很可能是由于担心导致无响应的延迟或电池寿命。流回手机。

可以在第三方应用程序中使用 Force Touch 作为输入法。在这一点上,我相信 Apple 建议在任何应用程序中强制触摸的唯一用途是显示上下文菜单,第三方开发人员可以完全访问它。您无需注册即可接收强制触摸事件。您只需在界面构建器中创建一个菜单,向其中添加菜单项,然后将这些菜单项连接到 WatchKit 扩展中的 IBActions。不必将菜单连接到相当于强制触摸手势识别器的东西是相当奇怪的,但是当你尝试它时,你会发现它有效。即使在 2015 年晚些时候我们有能力为 Watch 制作原生应用程序之后,这很可能仍然是第三方开发人员必须强制触摸的唯一访问权限。

然而,Apple 鼓励开发人员在http://bugreporter.apple.com上提交增强请求,因此这样做是个好主意,并要求访问这些 API,就像我们中的许多人已经拥有的那样。

于 2015-01-11T07:42:48.617 回答
10

目前,这两种输入法都没有自定义事件处理程序的能力。开发者论坛上的 Apple 员工建议提交功能请求。我怀疑明年我们可以开始创建原生 Apple Watch 应用程序后,我们就可以访问 Digital Crown API。目前,它仍然是数据输入的一个重大限制。

于 2014-11-24T10:53:50.813 回答
7

在 watchOS 2 中,(包含在 Xcode 7 测试版中)Apple 添加WKInterfacePicker了允许您注册代表和响应数字表冠变化的功能。您可以在此处查看文档。

于 2015-06-09T21:10:59.867 回答
4

在 WatchOS 2 中使用数字表冠选择 WKInterfacePicker 中的项目:

在手表应用扩展 InterfaceController.h

@property (strong, nonatomic) IBOutlet WKInterfacePicker *TestSelector;
@property (strong, nonatomic) NSArray *TestsArray;

在手表应用扩展 InterfaceController.m

// Setup two items the user can select from in picker
WKPickerItem *pickerItem1 = [WKPickerItem alloc];
[pickerItem1 setTitle:@"First item in list"];

WKPickerItem *pickerItem2 = [WKPickerItem alloc];
[pickerItem2 setTitle:@"Second item in list"];

// Add items to array that will be used to set picker list
self.TestsArray = [[NSArray alloc ]  initWithObjects:pickerItem1,pickerItem2, nil];
// Set list of items as choices in the picker list
[TestSelector setItems:self.TestsArray];

在界面生成器中,将选取器 UI 元素链接到 TestSelector 作为引用出口

于 2015-06-09T22:46:31.617 回答