Очередь анимации выдвигает серию UILabels с помощью Facebook POP и Swift

Я хочу "поставить в очередь" последовательность анимации, которая бы последовательно выдвигала серию меток из поля зрения с небольшой задержкой между каждым выдвижением. Начиная с верхнего и заканчивая последним. В настоящее время у меня есть следующая функция, которую я вызываю по нажатию кнопки:

func slideLabelsOut(labelArguments: UILabel...) {

    var labelAnimation = POPDecayAnimation();
    labelAnimation.property = POPAnimatableProperty.propertyWithName(kPOPLayerPositionX) as POPAnimatableProperty;

    labelAnimation.velocity = -720;

    for label in labelArguments {
        var layer = label.layer;
        layer.pop_addAnimation(labelAnimation, forKey: "Slide");
    }

}

Итак... Я попытался использовать usleep() в цикле for, однако, как я обнаружил, он блокирует основной поток, который абсолютно бесполезен для меня... Так есть ли какое-либо встроенное решение для такого рода вещей в Pop? Или я должен использовать какой-то другой фреймворк? Кроме того... если нет встроенного решения, как я должен подходить к анимации в очереди в будущем (я думаю, я буду делать это много)?

2 ответа

Этот ответ специфичен для платформы POP Facebook.

Каждая анимация POP является подклассом POPAnimation класс, который имеет beginTime имущество.

/**
 @abstract The beginTime of the animation in media time.
 @discussion Defaults to 0 and starts immediately.
 */
@property (assign, nonatomic) CFTimeInterval beginTime;

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

У меня есть подобное требование. Я анимирую указатель направления ветра как часть погодного приложения. Когда он отображает погоду в течение дня, указатель на датчике будет перемещаться вокруг точек компаса - точно так же, как и лопасть ветра. У меня это работает в Objective C, как очередь, в которую я добавил последовательные анимации, а затем я проигрываю анимации из очереди. У меня также есть похожая анимация для термометра, показывающая, как уровень ртути повышался и падал в течение дня.

В основном у меня есть функция getNextAnimation, которая получает анимацию из очереди и запускает ее. Когда анимация завершается, она вызывает getNextAnimation. Таким образом, анимация цепляется друг на друга. Как только я поставил в очередь свои анимации, я вызываю getNextAnimation, чтобы начать последовательность.

Я портирую это приложение на Swift и вчера начал работать над анимацией. Я думаю, что я буду использовать тот же подход:

Моя очередь и функция getNetxAnimation:

typealias animationBlock = ()->Void
var animationBlocks:Array<animationBlock> = Array()
func getNextAnimation() -> animationBlock?
{
    var block:animationBlock?
    if animationBlocks.count > 0 { block = animationBlocks.removeAtIndex(0) }
    return block;
}

Мои анимации добавляются с использованием кода, похожего на код (кривые и фактическая анимация зависят от моего приложения):

var aBlock:animationBlock = { () in
    UIView.animateWithDuration(self.secondsPerAnimation,
        delay: 0.0,
        options: UIViewAnimationOptions.CurveEaseInOut | UIViewAnimationOptions.BeginFromCurrentState,
        animations: {
            self.windDirectionPointer!.transform = CGAffineTransformMakeRotation(degreesToRadians(degrees))
        },
        completion: { (value: Bool) -> Void in
            var block:animationBlock? = getNextAnimation()
            if (block) { block!() }
        })
}
animationBlocks.append(aBlock)

Я запускаю анимацию с помощью:

getNextAnimation()!()  // This assumes that getNextAnimation doesn't return nil!
Другие вопросы по тегам