2015-03-06 16 views
26

Czy istnieje ActivityIndicator (lub coś w tym stylu) w WatchKit dla Apple Watch? W jaki sposób przekazujesz użytkownikom opinie na temat długotrwałej aktywności w tle?Czy w WatchKit na Apple Watch znajduje się ActivityIndicator?

+2

Szczerze mówiąc, po przeczytaniu dokumentacji i wytycznych firmy Apple, jeśli trzeba wskaźnik aktywności lub pasek postępu wtedy cokolwiek cię "Próbowanie zrobić nie jest odpowiednie dla Apple Watch. Apple jednoznacznie mówi, że programiści mogą "oczekiwać, że interakcje z aplikacjami do zegarków będą odbywać się w sekundach [nie minutach]". Interakcje są szybkie. Użytkownik nie powinien czekać dłużej niż sekundę, aby coś załadować. –

+2

To brzmi dobrze w teorii, ale podczas pobierania danych przez sieć, nie można zagwarantować, że wszystko jest gotowe w 1 sekundę. Interfejs WatchKit nie _nieni_ gdy ładuję mój JSON z Alamofire. Użytkownik widzi tylko czarny ekran zegarka i uważa, że ​​aplikacja jest zepsuta. Co byś zrobił, żeby to naprawić? – stk

+0

Sprawdź moją odpowiedź, aby uzyskać więcej informacji na ten temat. Mam nadzieję, że w przyszłości w wersji WATCH będziesz mógł wykonywać te zadania bezpośrednio na urządzeniu. –

Odpowiedz

16

Ta autorytatywna odpowiedź od inżyniera Apple na pytanie, dlaczego nie powinieneś wykonywać operacji sieciowych za pomocą aplikacji Apple Watch.

Istnieją dwa duże powody, aby nie wykonywać operacje sieciowe z zegarkiem app/rozszerzenia:

  1. użytkownicy korzystają ze swoich zegarków tylko przez krótki okres czasu. Zobacz na ten temat Human Interface guidelines.

    Jeśli mierzysz interakcje z aplikacją na iOS w kilka minut, możesz oczekiwać, że interakcje z aplikacją WatchKit będą mierzone w kilka sekund. Dlatego interakcje powinny być krótkie, a interfejsy powinny być proste.

  2. System może się zakleić, jeśli żądanie sieci nie zostanie zakończone.

    Nasza rada jest taka, że ​​w ogóle nie należy wykonywać skomplikowanych operacji sieciowych wewnątrz WatchKit Extension ...

    [Apple zaleca deweloperzy] mają jeden proces, który jest odpowiedzialny za aktualizowanie informacji w bazie danych (prawdopodobnie Twój iOS), a następnie swoje rozszerzenia miałby (zasadniczo) tylko do odczytu dostęp do tej bazy danych] [pamięci podręcznej ....


To powiedziawszy. Jeśli naprawdę potrzebujesz UIActivityIndicator, rdar: // 19363748 (nie sądzę, że ten został już otwarty), programiści złożyli już wnioski o oficjalne wsparcie.

Można utworzyć serię obrazów w wybranym stylu wskaźnika aktywności, a następnie animować je za pomocą interfejsu API startAnimatingWithImagesInRange:duration:repeatCount:. Zobacz przykład aplikacji Apple Lister na temat animacji .

Alternatywnie, spójrz na here, aby obejrzeć samouczek WatchKit i included "spinner" graphics.

+0

+1, ponieważ 2) jest dla mnie całkowicie nowy. Cóż, czytam wątek i mówią o CloudKit. Inżynier Apple również zgłasza słowo kluczowe "_complex_ networking". Nie sądzę, że JSON za pośrednictwem HTTP to skomplikowana sieć. Ale tak czy owak, widzę sens i muszę pozwolić, aby to zapadło. – stk

+3

Facet mówi, że należy wykonać dowolną prośbę sieciową, uruchamiając główną aplikację w tle, tj. Nie robiąc właściwego kodu sieciowego w aplikacji rozszerzającej. Wynika to z tego, że rozszerzenie watchkita (może) funkcjonuje tylko wtedy, gdy aplikacja jest otwarta na zegarku. W związku z tym nie oznacza to, że aplikacja typu watchkit nie może zainicjować żądania, które odbywa się gdzie indziej - spinner jest jednym ze sposobów pokazania, że ​​coś się dzieje, jeśli programista chce to zilustrować w ten sposób. –

+1

Tam * znajduje się * wskaźnik aktywności na zegarku. Moja aplikacja asynchronizuje operacje sieciowe w tle z aplikacją towarzyszącą, a jeśli sieć działa wolno, może to chwilę potrwać. Nie ma znaczenia, gdzie działa aktywność sieciowa, nadal dobrze byłoby móc pokazać użytkownikowi, że to się dzieje. Na zegarku jest już wskaźnik, więc byłoby to marnowanie cennych (ograniczonych) zasobów, aby pobrać sekwencję obrazów do zegarka na coś, co już istnieje w systemie pokładowym, a także przedstawić więcej spójne doświadczenie dla użytkownika. –

4

Nie ma metody wyświetlania ActivityIndicator w strukturze WatchKit. Możesz jednak przygotować okrągły obraz i samodzielnie stworzyć nieskończoną animację. Przygotowanie obrazów i nazwij je jak tego frame-0, frame-1, frame-2...frame-n

a następnie w kodzie:

[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. 

nadzieję, że to pomaga.

+0

Zasadniczo szukam standardowego obiektu ActivityIndicator, który WatchKit wykorzystuje podczas uruchamiania nowego kontrolera ViewController. Jeśli ktoś może dostarczyć dokładnie to jako kod Copy + Paste, otrzyma moją akceptowaną odpowiedź. :) – stk

+0

Spójrz na moją odpowiedź, to jest dokładnie to, czego potrzebowałem. +1 za posiadanie połowy odpowiedzi. – stk

+0

Ale jeśli wspomnę o tej samej nazwie, jak firstFrame- w setImageNamed. Daje mi błąd mówiąc, że nie mogę znaleźć nazwy obrazu. Czy jest wymagana jakakolwiek zmiana konfiguracji? –

14

Wystarczy dodać do możliwości, jakie stworzył JBWatchActivityIndicator projekt na GitHub, który pozwala generować własne sekwencje obrazów: https://github.com/mikeswanson/JBWatchActivityIndicator

Obejmuje ona również animacje wskaźnik aktywności apple-jak jeśli nie chcą Stwórz swój własny.

2

Moim zdaniem, próba stworzenia własnego Spinnera wymaga użycia nadmiernych zasobów. Gdyby Apple uznał to za dobry pomysł, zasugerowaliby to.

Zamiast tego miałbym tylko Obraz, który dostosowałeś Alfę. Użyj wartości boolowskiej, aby sprawdzić, czy powinieneś dodawać lub odejmować 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]; 

}

Powiązane problemy