RxSwift 使用 RxCocoa 绑定到动画
Posted
技术标签:
【中文标题】RxSwift 使用 RxCocoa 绑定到动画【英文标题】:RxSwift bind to with animation with RxCocoa 【发布时间】:2018-06-20 16:03:18 【问题描述】:我有一个绑定到 UILabel 文本的 UIStepper 值:
unitsStepper.rx.value.asObservable()
.map Int($0).description
.bind(to: stepperCountLabel.rx.text)
.disposed(by: rx.disposeBag)
而且我想在标签每次更改时为其设置动画,有更好的方法来代替这个吗?
unitsStepper.rx.value.asObservable()
.map Int($0).description .subscribe(onNext: [weak self] value in
guard let strongSelf = self else return
UIView.animate(withDuration: 0.4, animations:
strongSelf.stepperCountLabel.text = value
strongSelf.stepperCountLabel.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
, completion: completed in
strongSelf.stepperCountLabel.transform = CGAffineTransform.identity
)
).disposed(by: rx.disposeBag)
【问题讨论】:
【参考方案1】:就个人而言,我不认为这有什么问题。如果您希望它更具可读性,更少嵌套,那么您可以将其拆分一下。你的需求会有所不同,你不想用非常具体的东西来污染一般的东西,但看起来你有一些重复的东西,一种脉动。
我需要类似的东西来进行表单验证,然后写了这个(虽然你的实际动画更简单,我想我从一个多部分关键帧动画开始,但将它简化为来回)
extension UIView
func shake(totalDuration: TimeInterval, totalCycles: Int = 1)
let animationDuration = totalDuration / Double(totalCycles)
let wiggle = CAKeyframeAnimation(keyPath: "transform.rotation.z")
wiggle.values = [0.0, -0.04, 0.04, 0.0]
wiggle.duration = animationDuration
wiggle.repeatCount = Float(totalCycles)
layer.add(wiggle, forKey: "wiggle")
let vertical = CAKeyframeAnimation(keyPath: "transform.translation.y")
vertical.values = [0.0, -2.0, 2.0, 0]
vertical.duration = animationDuration
vertical.repeatCount = Float(totalCycles)
layer.add(vertical, forKey: "vertical")
let horizontal = CAKeyframeAnimation(keyPath: "transform.translation.x")
horizontal.values = [0.0, 2.0, -2.0, 0]
horizontal.duration = animationDuration
horizontal.repeatCount = Float(totalCycles)
layer.add(horizontal, forKey: "horizontal")
func pulse(totalDuration: TimeInterval, ratio: CGFloat = 1.2)
UIView.animateKeyframes(
withDuration: totalDuration,
delay: 0,
options: [],
animations:
UIView.addKeyframe(
withRelativeStartTime: 0,
relativeDuration: 0.5,
animations: [unowned self] in
self.transform = .init(scaleX: ratio, y: ratio)
)
UIView.addKeyframe(
withRelativeStartTime: 0.5,
relativeDuration: 0.5,
animations: [unowned self] in
self.transform = .identity
)
, completion: completed in )
然后我编写了一个带有条件和动作闭包的简单验证器结构,并在表单更改/验证时压缩它们的列表。
但是回到你的问题,你的动画本身是最小的,如果它是一次性的,你可以把它放在封闭类中,如果它是通用的,你可以将它添加为扩展,但作为一个 -关闭,它仍然很好(如果我正在阅读代码)
【讨论】:
以上是关于RxSwift 使用 RxCocoa 绑定到动画的主要内容,如果未能解决你的问题,请参考以下文章
使用 RxSwift/RxCocoa 制作的 TableView 在绑定到的变量中的数据更改后出现故障
处理 UITableView 绑定中的连接错误(Moya、RxSwift、RxCocoa)
如何测试 RxSwift 变量和 RxCocoa Observable 之间的 UI 绑定?