WatchOS 2 - Передача последовательностей изображений для анимации

У меня возникли проблемы с преобразованием моего приложения из WatchOS 1 в WatchOS2. Я программно создаю последовательность изображений на iPhone для воспроизведения на часах.

Я помещаю их в zip-файл (используя SSZipArchive) в iOS и использую transferFile(), чтобы отправить его на часы, где я распаковываю его в делегате Watch Extension в общий контейнер между Watch Extension и Watch App, который приложение Watch может воспроизвести последовательность позже:

func session(session: WCSession, didReceiveFile file: WCSessionFile) 
{
    imagesURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.xxxx.images")

    SSZipArchive.unzipFileAtPath(file.fileURL.path, toDestination:imagesURL!.path)
}

Я проверил правильность настройки общей группы и вижу файлы изображений в общем каталоге (imagesURL!.path).

Но когда я готов сыграть последовательность с:

image.setImageNamed("myImages") // myImages0.png, myImages1.png, myImages2.png, etc.

Я получаю сообщение об ошибке: Не удается найти изображение с именем «myImages» на часах.

  • Я помещаю изображения в нужное место?
  • Правильно ли я ссылаюсь на них в setImageNamed?
  • Я пропустил что-то еще?

person ScottyB    schedule 01.07.2016    source источник


Ответы (2)


Правильный ответ — использовать метод animatedImageNamed:duration: UIImage, если у вас уже есть серия файлов изображений, а затем установить эту анимацию с помощью метода setImage:.

Таким образом, исправление моего исходного кода представляет собой простое однострочное изменение:

image.setImage( UIImage.animatedImageNamed("myImages", 3) ) // myImages0.png, myImages1.png, myImages2.png, etc.

(при условии, что продолжительность составляет 3 секунды)

person ScottyB    schedule 02.07.2016

Почему setImageNamed: терпит неудачу

Согласно WKInterfaceImage документации, setImageNamed загружает изображение из пакет приложений для часов.

По возможности размещайте ресурсы изображений в каталоге ресурсов в комплекте приложения Watch (не в комплекте расширения WatchKit). Размещение их в комплекте приложения Watch позволяет использовать метод setImageNamed: для загрузки анимированного изображения во время выполнения, что упрощает процесс загрузки.

Чтобы загрузить последовательность анимированных изображений из изображений в комплекте приложений для часов, вы должны правильно назвать свои ресурсы изображений и использовать метод setImageNamed: этого класса.

Вот почему setImageNamed: не может найти изображения, поскольку они не являются статическим ресурсом, связанным с приложением для часов.

Как загрузить динамическое анимированное изображение

Поскольку ваши анимационные изображения являются динамическими, это обрабатывается расширением приложения для часов.

Для динамически генерируемых анимаций используйте метод animatedImageWithImages:duration: UIImage, чтобы собрать анимацию в расширении WatchKit, а затем установите эту анимацию с помощью метода setImage:.

Вам нужно сначала использовать animatedImageWithImages:duration: для сборки переданного динамического анимированного изображения, а затем установить эту анимацию с помощью setImage:

let animatedImages = UIImage.animatedImageWithImages(images, duration: 3)
image.setImage(animatedImages)

Обновление:

Как указал Скотти, лучшим решением является использование animatedImageNamed:duration:, чтобы не создавать массив изображений!

person Community    schedule 01.07.2016
comment
Спасибо, что направили меня в правильном направлении. Однако я понял, что мне следует создать анимированный UIImage на телефоне, а затем отправить его напрямую (например: stackoverflow.com/questions/29515599/). Я неправильно пытался использовать старый подход Watch OS 1 с файлами изображений. Это объясняет, почему никто (кроме меня) не говорит об использовании файлов изображений для анимации в Watch OS 2! На самом деле, я думаю, об этом говорится в руководстве Apple по переходу на Watch OS 2, которое, кажется, больше не доступно в Интернете. - person ScottyB; 02.07.2016