2015-03-06 15 views
26

Esiste un ActivityIndicator (o qualcosa di simile) in WatchKit per Apple Watch? Come fai a dare il feedback degli utenti su attività di background più durature?Esiste un ActivityIndicator in WatchKit per Apple Watch?

+2

Onestamente, dopo aver letto la documentazione e le linee guida di Apple, se avete bisogno di un indicatore di attività o di barra di avanzamento, allora tutto ciò che Stai cercando di fare non è adatto per l'Apple Watch. Apple afferma esplicitamente che gli sviluppatori possono "aspettarsi che le interazioni con le app di controllo siano in secondi [non minuti]". Le interazioni sono veloci Un utente non dovrebbe aspettare più di un secondo per caricare qualcosa. –

+2

Questo suona bene in teoria, ma quando si recuperano i dati attraverso la rete, non si può garantire che sia tutto pronto in 1 secondo. L'interfaccia di WatchKit fa _nothing_ quando sto caricando il mio JSON con Alamofire. L'utente vede solo una schermata nera dell'orologio e pensa che l'app non funzioni. Cosa faresti per risolvere questo problema? – stk

+0

Controlla la mia risposta per maggiori dettagli su questo. Speriamo che in una futura iterazione di WATCH, sarete in grado di eseguire queste attività direttamente sul dispositivo. –

risposta

16

Questo thread on the Apple Developer forums ha una risposta autorevole da un ingegnere Apple sul motivo per cui non si dovrebbero eseguire operazioni di rete con Apple Watch.

Ci sono due grandi motivi per non eseguire operazioni di rete dal tuo orologio app/estensione:

  1. gli utenti interagiscono con i loro orologi solo per un breve periodo di tempo. Vedi lo Human Interface guidelines su questo.

    Se si misurano le interazioni con l'app iOS in pochi minuti, è possibile prevedere che le interazioni con l'app WatchKit possano essere misurate in pochi secondi. Quindi le interazioni dovrebbero essere brevi e le interfacce dovrebbero essere semplici.

  2. Il sistema potrebbe bloccarsi se la richiesta di rete non viene completata.

    La nostra raccomandazione è che, in generale, non è necessario eseguire le operazioni di rete complesse all'interno di un'estensione WatchKit ...

    [Apple raccomanda che gli sviluppatori] hanno un unico processo che si occupa di aggiornare le informazioni nel database (probabilmente la vostra app iOS), e poi le estensioni avrebbero accesso (essenzialmente) di sola lettura a questo database [cache] ....


Detto questo. Se hai davvero bisogno di UIActivityIndicator, rdar: // 19363748 (non penso che questo sia stato ancora aperto al radar), gli sviluppatori hanno già presentato richieste di supporto ufficiale.

È possibile creare una serie di immagini nello stile dell'indicatore di attività desiderato e quindi animarle utilizzando l'API startAnimatingWithImagesInRange:duration:repeatCount:. Vedi l'app Lister di Apple per un esempio di animazione .

In alternativa, guardare here per un tutorial di Animazione WatchKit e included "spinner" graphics.

+0

+1, perché 2) è completamente nuovo per me. Bene, ho letto il thread e stanno parlando di CloudKit. L'ingegnere Apple lancia anche la parola chiave "_complex_ networking". Non credo che JSON via HTTP sia una rete complessa. Ma comunque, vedo il punto e devo lasciarlo affondare. – stk

+3

Quello che dice il ragazzo-mela è che dovresti eseguire qualsiasi richiesta di rete lanciando l'app principale in background, cioè non facendo il vero codice di rete nella tua app di estensione. Questo perché l'estensione del watchkit (può) vive solo quando l'app è aperta sull'orologio. Detto ciò, ciò non significa che un'app di watchkit non possa avviare una richiesta che si verifica async da qualche altra parte: uno spinner è un modo per dimostrare che qualcosa sta succedendo, se lo sviluppatore vuole illustrarlo in questo modo. –

+1

C'è * un * indicatore di attività sull'orologio. La mia app esegue operazioni di rete in background asincrone dall'app complementare e, se la rete è lenta, potrebbe richiedere un po 'di tempo. Non importa dove sta accadendo l'attività di rete, sarebbe comunque bello poter mostrare all'utente che sta succedendo. C'è già un indicatore sull'orologio, quindi sarebbe uno spreco di risorse preziose (limitate) di dover scaricare una sequenza di immagini per l'orologio per qualcosa che già esiste nel suo sistema di bordo, e presenterebbe anche un altro esperienza coerente per l'utente. –

4

Non esiste alcun metodo per visualizzare ActivityIndicator in WatchKit Framework. Tuttavia puoi preparare un'immagine circolare e creare facilmente animazioni infinite. Preparare immagini e assegnare loro un nome come questo frame-0, frame-1, frame-2...frame-n

e poi nel codice:

[self.yourInterfaceImage setImageNamed:@"firstFrame-"]; //setting first frame 
    [self.yourInterfaceImage startAnimatingWithImagesInRange:[self.model imageRange] 
               duration:0.4 
              repeatCount:0]; 
    // [self.model imageRange] will return NSRange from 0 to n 
    // repeatCount == 0 means infinity. Of course you can set some limit, like 100. 

Spero che questo aiuti.

+0

Fondamentalmente, sto cercando lo standard ActivityIndicator circolante che WatchKit utilizza all'avvio di un nuovo ViewController. Se qualcuno può consegnare esattamente questo come un codice Copia + Incolla, otterrà la mia risposta accettata. :) – stk

+0

Dai un'occhiata alla mia risposta, è esattamente ciò di cui avevo bisogno. +1 per avere la metà della risposta. – stk

+0

Ma se menziono lo stesso nome come firstFrame- nel setImageNamed. Mi dà l'errore dicendo che non riesco a trovare il nome dell'immagine. C'è qualche modifica alla configurazione richiesta per questo? –

14

Giusto per aggiungere alle opzioni, ho creato un progetto JBWatchActivityIndicator su GitHub che consente di generare le proprie sequenze di immagini: https://github.com/mikeswanson/JBWatchActivityIndicator

include anche di Apple-come indicatore di attività animazioni se non si vuole crea il tuo.

2

A mio parere, provare a creare il proprio Spinner utilizza risorse eccessive. Se Apple avesse pensato che fosse una buona idea, l'avrebbero suggerito.

Vorrei invece solo un'immagine che si regola l'Alpha. Usa un booleano per vedere se dovresti aggiungere o sottrarre Alpha.

if (add) 
    { 
     count=count+5; 
     if (count==100) 
     { 
      add=false; 
     } 
    } 
    else 
    { 
     count=count-5; 
     if (count==0) 
     { 
      add=true; 
     } 
    } 

    float thealpha=((float)count/100); 
    [self.scanb setAlpha:thealpha]; 

}

Problemi correlati