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 绑定?

RxSwift、RxCocoa 和 UITableview

RxSwift + RxRealm + RxCocoa 向 UITableView 插入行

将 SwiftUI 按钮绑定到 AnySubscriber,例如 RxCocoa 的按钮点击