2015-03-06 3 views
26

Есть ли ActivityIndicator (или что-то в этом роде) в WatchKit для Apple Watch? Как вы все можете дать отзыв пользователей о более продолжительной фоновой активности?Есть ли ActivityIndicator в WatchKit для Apple Watch?

+2

Честно говоря, после прочтения документации и руководства Apple, если вам нужен индикатор активности или индикатор прогресса, то все, что вам «Попробуйте сделать это не подходит для Apple Watch. Apple прямо заявляет, что разработчики могут «ожидать взаимодействия с часами в секундах [не минут]». Взаимодействие происходит быстро. Пользователю не нужно ждать больше секунды для загрузки. –

+2

Это звучит неплохо в теории, но при извлечении данных по сети вы не можете гарантировать, что все готово за 1 секунду. Интерфейс WatchKit не работает, когда я загружаю JSON с помощью Alamofire. Пользователь видит только черный экран часов и считает, что приложение сломано. Что бы вы сделали, чтобы исправить это? – stk

+0

Проверьте мой ответ, чтобы узнать подробности об этом. Надеемся, что в будущей итерации WATCH вы сможете выполнить эти задачи прямо на устройстве. –

ответ

16

Этот thread on the Apple Developer forums имеет авторитетный ответ от инженера Apple о том, почему вы не должны выполнять сетевые операции с Apple Watch.

Есть две большие причины, чтобы не выполнять сетевые операции с циферблата приложения/расширения:

  1. пользователи взаимодействуют со своими часами в течение короткого периода времени. См. Human Interface guidelines на этом.

    Если вы измеряете взаимодействие с вашим приложением iOS за считанные минуты, вы можете ожидать, что взаимодействие с вашим приложением WatchKit будет измеряться в считанные секунды. Поэтому взаимодействие должно быть кратким, а интерфейсы должны быть простыми.

  2. Система может зайти в тупик, если сетевой запрос не завершен.

    Наша рекомендация состоит в том, что, в общем, вы не должны выполнять сложные операции сетей внутри Extension WatchKit ...

    [Apple рекомендует разработчикам] иметь единый процесс, который отвечает за обновление информации в базе данных (вероятно, ваш IOS приложении), а затем ваши расширения будут иметь (по существу) доступ только для чтения к этому [кэшированным] базам данных ....


Это сказано. Если вам действительно нужен идентификатор UIActivityIndicator, rdar: // 19363748 (я не думаю, что этот еще был открыт радаром) разработчики уже подали заявки на официальную поддержку.

Вы можете создать серию изображений в стиле индикатора активности по вашему выбору, а затем анимировать их с помощью API startAnimatingWithImagesInRange:duration:repeatCount:. См. Приложение Apple Lister для примера анимации .

В качестве альтернативы посмотрите here для учебника по анимации WatchKit и included "spinner" graphics.

+0

+1, потому что 2) совершенно для меня совершенно. Ну, я прочитал нить, и они говорят о CloudKit. Инженер Apple также бросает ключевое слово «_complex_ networking». Я не думаю, что JSON через HTTP - это сложная сеть. Но, в любом случае, я вижу смысл и должен позволить этому погрузиться. – stk

+3

Что говорит парень-яблок, так это то, что вы должны выполнить любой сетевой запрос, запустив основное приложение в фоновом режиме, т. Е. Не сделав фактический сетевой код в своем приложении расширения. Это связано с тем, что расширение часового пояса (может) сохраняется только тогда, когда приложение открыто на часах. С учетом сказанного это не означает, что приложение watchkit не может инициировать запрос, который происходит в async где-то еще - spinner - это один из способов показать, что что-то происходит, если разработчик хочет проиллюстрировать его таким образом. –

+1

Здесь есть * индикатор активности на часах. Мое приложение выполняет асинхронные фоновые сетевые операции из приложения-компаньона, и если сеть работает медленно, это может занять некоторое время. Неважно, где происходит сетевая активность, было бы неплохо показать пользователю, что это происходит. На часах уже есть индикатор, поэтому было бы тратой драгоценных (ограниченных) ресурсов на загрузку последовательности изображений на часы для чего-то, что уже существует в его бортовой системе, и оно также представило бы более постоянный опыт для пользователя. –

4

Нет способа отображения ActivityIndicator в WatchKit Framework. Однако вы можете подготовить круговой образ и легко создать бесконечную анимацию самостоятельно. Подготовка изображений и назовите их как этот frame-0, frame-1, frame-2...frame-n

, а затем в вашем коде:

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

Надеется, что это помогает.

+0

В принципе, я ищу стандартный циркулирующий ActivityIndicator, который WatchKit использует при запуске нового ViewController. Если кто-то может поставить именно это как код Копировать + Вставить, он получит мой принятый ответ. :) – stk

+0

Взгляните на мой ответ, это именно то, что мне нужно. +1 за половину ответа. – stk

+0

Но если я упомянул то же имя, что и firstFrame- в setImageNamed. Это дает мне ошибку, говорящую о невозможности найти имя изображения. Требуется ли изменение конфигурации для этого? –

14

Просто, чтобы добавить к опциям, я создал JBWatchActivityIndicator проект на GitHub, который позволяет создавать собственные последовательности изображений: https://github.com/mikeswanson/JBWatchActivityIndicator

Он также включает в себя компании Apple, как индикатор активности анимации, если вы не хотите создайте свой собственный.

2

На мой взгляд, попытка создать собственный Spinner использует чрезмерные ресурсы. Если бы Apple подумала, что это хорошая идея, они бы предложили это.

Вместо этого у меня вместо этого есть изображение, которое вы настраиваете Alpha. Используйте логическое значение, чтобы увидеть, нужно ли добавлять или вычитать 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]; 

}

Смежные вопросы