UIView.animate不能迅速正常工作

mar*_*ral 2 ios 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
    )
}
Run Code Online (Sandbox Code Playgroud)

它被称为:

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

resultBtn.addTarget(self, action: #selector(self.showResult), for: .touchUpInside)
Run Code Online (Sandbox Code Playgroud)

San*_*ari 5

尝试在主线程上触发通知

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

原因:

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