首页 > 解决方案 > UIView.animate 不能在 swift 中正常工作

问题描述

我有一个动画视图的 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)

标签: iosswift

解决方案


尝试在主线程上触发通知

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

原因:

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


推荐阅读