获取WatchOS Digital Crown值

时间:2017-08-17 04:31:55

标签: swift watchkit

我一直在研究制作Apple Watch应用程序,但我在获取Digital Crown的价值方面遇到了一些麻烦。我查看了WKCrownSequencer,但不确定如何处理它。有人可以告诉我如何获得一个值为1-10的变量,当你转动数字冠时它会改变。谢谢!

2 个答案:

答案 0 :(得分:0)

在WatchOS3之后,可以获得Digital Crown的价值。查看this documentation on Apple.

基本上您需要在View Controller中使用WKCrownDelegate。示例代码将是这样的:

- (void)willActivate {
    [super willActivate];
    self.crownSequencer.delegate = self;
    [self.crownSequencer focus];
}

- (void)crownDidRotate:(WKCrownSequencer *)crownSequencer rotationalDelta:(double)rotationalDelta {
    self.totalDelta = self.totalDelta + rotationalDelta;
    [self updateLabel];
}

- (void)updateLabel {
    [self.label setText:[NSString stringWithFormat:@"%f", self.totalDelta]];
}

什么是rotationDelta

值1.0表示表冠完全旋转。

注意:请不要直接使用此代码,这只是一个例子。首先查看Apple网站上的文档。

答案 1 :(得分:0)

您需要将InterfaceController子类符合WKCrownDelegate并实施crownDidRotate方法。

如果您希望您的值介于1和10之间,您只需要实现一些简单的逻辑来检查添加rotationalDelta时的值是什么,以及它是否超出范围1- 10,将值映射到1或10,具体取决于新值将超过的方向。我假设您希望valueInt,如果没有,只需删除rotationalDeltaInt的转换,value将为Double

请注意,rotationalDelta 1.0代表表冠的完整旋转,rotationalDelta根据旋转方向改变其符号。

class MyInterfaceController: WKInterfaceController, WKCrownDelegate {
    var value = 1
    @IBOutlet var label: WKInterfaceLabel!

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        crownSequencer.delegate = self
    }

    func crownDidRotate(_ crownSequencer: WKCrownSequencer?, rotationalDelta: Double) {
        let newValue = value + Int(rotationalDelta)
        if newValue < 1 {
            value = 1
        } else if newValue > 10 {
            value = 10
        } else {
            value = newValue
        }
        label.setText("Current value: \(value)")
    }
}