Очередь анимации выдвигает серию 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!