【问题标题】:Swift: how to finish a UIView draw animation before changing a labelSwift:如何在更改标签之前完成 UIView 绘制动画
【发布时间】:2021-02-25 18:03:31
【问题描述】:

我有一点关于动画时间的问题。

顺序应该是:

  1. 按钮被按下
  2. 动画显示
  3. 标签已更改

实际上顺序是:

  1. 按钮被按下
  2. 标签已更改
  3. 动画显示

这里是主VC的代码:

import Foundation
import UIKit

class MainVC: UIViewController {

  var counter: Int = 0

  @IBOutlet weak var counterLabel: UILabel!
  
  @IBOutlet weak var nextButton: UIButton!

  @IBOutlet weak var animationView: AnimationView!

  @IBAction func nextButtonPressed(_ sender: UIButton) {
     counter += 1
     animationView.progress = 1
     //this view draws a progress bar and animates it from 0 to 100% via CABasicAnimation. 
     counterLabel.text = "\(counter)"
     animationView.progress = 0 
     //the progress bar is reset
  }

  override func viewDidLoad() {
     super.viewDidLoad()
     nextButton.setTitle("Next")
     counterLabel.text = "\(counter)"
  }

}

我已经尝试过调度队列,但我无法让它正常工作。关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: ios swift xcode uiviewanimation


    【解决方案1】:

    您没有展示足够多的代码,我们无法专门为您提供帮助。

    一般来说,你会设置一些对象作为你的 CAAnimation 的委托,并实现方法func animationDidStop(_ anim: CAAnimation, finished flag: Bool)。

    在该方法中,您将更改标签文本(假设为finished == true。)

    我不太喜欢动画的委托模式。如果您有多个动画,为每个动画处理自定义完成代码可能会很痛苦。我所做的是利用您可以将对象附加到 CAAnimation 对象,并将闭包附加到动画的事实。然后我将视图控制器设置为委托,并在视图控制器的animationDidStop() 中查找附加到动画的闭包,如果有则执行它。

    编辑:

    有关使用键值编码将对象附加到 CAAnimation 和 CALayer 对象的讨论,请参阅本文:

    Core Animation Key-value coding extensions

    它很老,使用 Objective-C 编写,但概念在 Swift 中是相同的,并且非常有用。有关键值编码的更一般性讨论,已针对 Swift 进行了更新,请参阅这篇文章:https://developer.apple.com/documentation/objectivec/nsobject/nskeyvaluecoding

    (在Swift中你需要知道的两个函数是setValue(_:forKeyPath:)和value(forKey:)。)

    【讨论】:

    • 这其实很有帮助,我会尝试使用委托模式。我只有这一个动画,所以应该不会太复杂。
    • 如果我回答了你的问题,你应该接受我的回答。
    • 有效!非常感谢您的帮助!我是 Swift 的新手,不知道委托 func animationDidStop。
    • 很高兴能帮上忙。如果你是新手,那就搞清楚吧!你有其他语言的经验吗?
    • 当您查看像CABasicAnimation 这样的类时,请记住检查其祖先类中的方法。 CABasicAnimation 是CAAnimation 的子类,delegate 属性定义在父类中。 animationDidStop() 方法记录在CAAnimationDelegate 部分中。在 iOS/MacOS 中,一个对象具有一个委托属性是一种非常常见的设计模式,该属性定义了被调用的方法来通知您状态变化,或者让您有机会自定义“委托”对象的行为。跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多