watchos logo kit developer apple ios user-interaction watchkit apple-watch

ios - logo - WatchKit API para Force Touch/Digital Crown?



watchos 4 beta (5)

En WatchOS 2 para usar la corona digital para seleccionar un elemento en un WKInterfacePicker:

En la extensión de la aplicación de reloj InterfaceController.h

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

En la extensión de la aplicación de reloj 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];

En el constructor de interfaces, vincule el elemento de la interfaz de usuario del selector a TestSelector como referencia de salida

Estoy muy entusiasmado con las nuevas posibilidades de interacción para el usuario introducidas por el Apple Watch, entre ellas, Force Touch y Digital Crown.

Sin embargo, no pude encontrar menciones de ellos en la API de WatchKit. ¿Hay alguna forma de recibir eventos de Force Touch / Digital Crown? ¿Es posible tener manejadores personalizados para los eventos?


En este momento no hay capacidad para los controladores de eventos personalizados para ninguno de los métodos de entrada. Los empleados de Apple en los foros de desarrolladores han sugerido enviar una solicitud de función. Sospecho que tendremos acceso a la API de Digital Crown tan pronto como podamos comenzar a crear aplicaciones nativas de Apple Watch el próximo año. Por el momento sigue siendo una limitación importante para la entrada de datos.


En la actualidad (Xcode 6.2 beta 3), Apple ha indicado que Digital Crown desplazará el contenido de la página hacia arriba y hacia abajo en aplicaciones de terceros, pero las aplicaciones no se pueden registrar para recibir notificaciones de ella o para usarlas como dispositivo de entrada. Parece muy probable que esto se deba a inquietudes acerca de la latencia que conduce a la falta de capacidad de respuesta o la duración de la batería, dado que el código de un tercero se ejecuta únicamente en la extensión de la aplicación WatchKit en el iPhone y, por lo tanto, estos eventos deberían enviarse de forma inalámbrica. Transmitir de nuevo al teléfono.

Es posible usar Force Touch como un método de entrada en aplicaciones de terceros. En este punto, creo que el único uso que Apple ha recomendado para el toque de fuerza en cualquier aplicación es mostrar un menú contextual, y los desarrolladores externos tienen acceso completo a esto. No es necesario registrarse para recibir un evento de fuerza forzada. Simplemente cree un menú en el generador de interfaces, agregue elementos de menú y luego conecte esos elementos de menú a IBActions en su extensión WatchKit. Es bastante extraño no tener que conectar el menú a algo equivalente a un reconocedor de gesto de toque de fuerza, pero cuando lo pruebes, simplemente encontrarás que funciona. Es muy posible que este sea el único acceso que los desarrolladores externos tengan para forzar el contacto, incluso después de que tengamos la capacidad de crear aplicaciones nativas para el reloj más adelante en 2015.

Sin embargo, Apple ha alentado a los desarrolladores a enviar solicitudes de mejoras en http://bugreporter.apple.com, por lo que sería una buena idea hacerlo y solicitar acceso a estas API como muchos de nosotros ya lo hemos hecho.


En watchOS 2, (incluido en Xcode 7 beta), Apple ha agregado WKInterfacePicker para permitirle registrar un delegado y responder a los cambios de la corona digital. Puedes consultar la documentación here .


watchOS 3 agrega WKCrownSequencer y WKCrownDelegate para informar el estado de la corona digital (como la velocidad de rotación), así como para recibir notificaciones cuando el usuario gira la corona.

Puede usar el secuenciador de corona para proporcionar información general para controlar escenas u objetos de interfaz.

Apple ha actualizado su código de muestra del Catálogo WatchKit para incluir un ejemplo de secuenciador de corona WKInterfaceController que muestra cómo usar la corona digital Apple Watch para interactuar con otros objetos:

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