2014-11-22 52 views
23

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

但是,我在WatchKit API中找不到它们。有没有办法从Force Touch/Digital Crown收到活动?是否有可能为事件定制处理程序?

+3

力触只显示菜单项,您有addMenuItem添加。 ..在WKInterfaceControllers上。没有任何行动通过武力触及。与数码皇冠一样。 – mattyohe 2014-11-22 19:23:23

回答

10

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

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

苹果已经更新了他们的WatchKit Catalog sample code到包括WKInterfaceController冠序例子演示了如何使用Apple关注数字树冠与其他对象进行交互:

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

} 
10

此刻,对于任一输入方法都没有自定义事件处理程序的功能。开发者论坛上的Apple员工建议提交功能请求。我怀疑我们会在明年开始创建本地Apple Watch应用程序后立即访问Digital Crown API。目前它仍然是数据输入的重要限制。

12

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

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

不过,Apple已经鼓励开发者提交增强功能请求http://bugreporter.apple.com,所以最好这样做,并且要求我们已经拥有了一些访问这些API的方法。

7

在watchOS 2(包含在Xcode 7测试版中)Apple增加了WKInterfacePicker以允许您注册代表并响应数字表冠变更。您可以查看文档here

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作为参照插座