UIView.animate在Swift中无法正常工作

4

我有一个函数用于动画改变视图的Y轴位置。我通过两种方式调用它:第一种是作为按钮的操作目标,第二种是通过观察通知来调用。在第一种情况下,它可以正常工作,但是当通过通知调用时,它不能进行动画处理。该函数的代码如下:

func showResult() {
    resultMode = true

    self.containerView.frame.origin.y = CGFloat(1000)
    self.view.layoutIfNeeded()
    UIView.animate(
        withDuration: 3,
        animations: {
            self.containerView.frame.origin.y = CGFloat(200)
            self.view.layoutIfNeeded()
    } ,
        completion: nil
    )
}

这被称为:

NotificationCenter.default.addObserver(self, selector: #selector(self.showResult), name: NSNotification.Name(rawValue: "SHOWRESULT"), object: nil)

并且。
resultBtn.addTarget(self, action: #selector(self.showResult), for: .touchUpInside)

你能添加这两种情况的代码吗? - Ahmad F
2
如果Notification调用了showResult,请在主线程中执行。 - Pratik Prajapati
@AhmadF,我已经在问题中添加了代码。 - maral
@PratikPrajapati!谢谢,它起作用了! - maral
3个回答

6
尝试在主线程触发通知。
    DispatchQueue.main.async {
        NotificationCenter.default.addObserver(self, selector: #selector(self.showResult), name: NSNotification.Name(rawValue: "SHOWRESULT"), object: nil)
    }

原因:

常规通知中心在发布通知时会在发布通知的线程上进行通知。分布式通知中心会在主线程上发送通知。有时,您可能需要将通知传递到您指定的特定线程,而不是通知中心。例如,如果在后台线程中运行的对象正在监听用户界面的通知,如窗口关闭,您希望在后台线程中接收通知而不是在主线程中。在这些情况下,您必须捕获默认线程上传递的通知并将其重定向到适当的线程。


3

请在下面修改 showResult 方法:

func showResult() {
    resultMode = true

    self.containerView.frame.origin.y = CGFloat(1000)
    self.view.layoutIfNeeded()
    DispatchQueue.main.async {
        UIView.animate(
            withDuration: 3,
            animations: {
                self.containerView.frame.origin.y = CGFloat(200)
                self.view.layoutIfNeeded()
            } ,
            completion: nil
        )
    }
}

3
在我的情况下,我有一个按钮点击的闭包,在点击时需要动画颜色。经过几个小时的挫败后,将动画调用到DispatchMain中解决了问题。
copyButton.buttonPressedAction = { [weak self] in
  guard let self = self else {
    return
  }
  DispatchQueue.main.async {
    self.backgroundColor = .green
    UIView.animate(withDuration: 2, animations: {() -> Void in
      self.layer.backgroundColor = UIColor.clear.cgColor
    })
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接