Apple watch - первая анимация медленного изображения

Я создаю небольшое приложение для яблочных часов. У меня есть группа и ярлык внутри нее. Я пытаюсь сделать это:

  • анимационное фоновое изображение группы
  • исчезает в метке после окончания анимации изображения.

Мой код выглядит примерно так:

        group.setBackgroundImageNamed("show_back-");
        group.startAnimatingWithImagesInRange(NSMakeRange(0, 39), duration: 1.5, repeatCount: 1);
        let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1.5 * Double(NSEC_PER_SEC)))
        dispatch_after(delayTime, dispatch_get_main_queue()) { () -> Void in
            self.animateWithDuration(1) { () -> Void in
                self.label.setAlpha(1)
            };
        };

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

Как я могу заставить его работать последовательно? Я не смог найти какой-либо обратный вызов для анимации последовательности изображений, чтобы подписаться на нее.

ИЗМЕНИТЬ Еще одна проблема, которую я заметил: у меня есть другой случай, когда bg анимируется из блока dispatch_after, и когда я покидаю приложение, нажав на корону и вернусь, дважды нажав на нее, либо блок dispatch_after не запускается, либо фоновая анимация не отображается правильно при первом вызове (я думаю, второй, потому что я попытался добавить точку останова в блок отправки и запускался каждый раз, когда я тестировал). Я запускаю watchOS2, так что, возможно, это связано с бета-состоянием, в котором находится ОС?

Ответы

Ответ 1

попробуйте сделать

 group.setBackgroundImageNamed("show_back-");

 let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1.5 * Double(NSEC_PER_SEC)))

 dispatch_after(delayTime, dispatch_get_main_queue()) { () -> Void in
        self.animateWithDuration(1) { () -> Void in
             group.startAnimatingWithImagesInRange(NSMakeRange(0, 39), duration: 1.5, repeatCount: 1);
             self.label.setAlpha(1)
        };
    };

Я не совсем уверен, что вы делаете, но также попробуйте сделать animateWithDuration (0) или (1.5)

Ответ 2

Я столкнулся с тем же вопросом, что и вы.

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

func willActivate()

Я воспроизвожу последовательность анимации один раз в фоновом проходе, таким образом, когда мой пользователь нажимает на нее, изображения уже загружены.

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,     0)) { [weak self] in
            if let uSelf = self {
                uSelf.statusAnimationImage.setImageNamed("my image name")
                uSelf.statusAnimationImage.startAnimatingWithImagesInRange(NSMakeRange(0, 359), duration: 0.5, repeatCount: 1)
            }
        } 

Это был лучший способ решить эту проблему, и это работает для меня.