ReactiveCocoa 5 Анимации
Я пытаюсь оживить представление alpha
свойство после того, как я отправил ему некоторые значения через ReactiveSwift Signal Producer
,
Ниже показано, как я сейчас делаю это без анимации.
// Somewhere in View Model (for all code below)
let shouldShowShutter = MutableProperty<Bool>(false)
// In my View
self.shutterButton.reactive.alpha <~ self.viewModel.shouldShowShutter.map({ (show) -> CGFloat in
return show ? 1:0.0
})
Я могу неуверенно оживить вид с помощью:
self.viewModel.shouldShowShutter.producer.startWithSignal { (observer, disposable) in
observer.map({ (show) -> CGFloat in
return show ? 1:0.0
}).observeValues({ [unowned self] (alpha) in
UIView.animate(withDuration: 0.5, animations: {
self.shutterButton.alpha = alpha
})
})
}
Но я должен быть в состоянии оживить взгляды с ReactiveAnimation
:
self.shutterButton.reactive.alpha <~ self.viewModel.shouldShowShutter.map({ (show) -> CGFloat in
return show ? 1:0.0
}).animateEach(duration: 0.2).join(.Concat)
Вопрос: ReactiveCocoaLayout
а также ReactiveAnimation
и то, и другое, похоже, больше не работают с того времени, когда я задаю вопрос, по крайней мере, не с Swift 3 или ReactiveCocoa 5
поскольку они во многом зависят от наследия RACSignals
,
Существует ли более элегантный способ анимировать потоки сигналов для компонентов ReactiveCocoa с помощью ReactiveCocoa 5?
1 ответ
Я не знал о ReactiveAnimation раньше, но мне действительно понравился подход.
Поэтому я обновил его для RAC 5.0 / Swift 3.2, взгляните на мой форк. Я также создам запрос на извлечение, давайте посмотрим, сможем ли мы вернуть проект к жизни.
Я включил небольшой демонстрационный проект iOS, чтобы продемонстрировать использование:
label.reactive.center <~ SignalProducer.timer(interval: .seconds(1), on: QueueScheduler.main)
.map { _ in return self.randomPoint() }
// In order to demonstrate different flatten strategies,
// the animation duration is larger than the animation interval,
// thus a new animation begins before the running animation is finished
.animateEach(duration: 1.5, curve: .EaseInOut)
// With the .concat flatten strategy, each animations are concatenated.
// Each animation finisheds, before the next one starts.
// This also means, that animations are queued
.flatten(.concat)
// With the .merge flatten strategy, each animation is performed immediately
// If an animation is currently running, it is cancelled and the next animation starts from the current animation state
//.flatten(.merge)