我有一个为视图的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)
尝试在主线程上触发通知
DispatchQueue.main.async {
NotificationCenter.default.addObserver(self, selector: #selector(self.showResult), name: NSNotification.Name(rawValue: "SHOWRESULT"), object: nil)
}
Run Code Online (Sandbox Code Playgroud)
原因:
常规通知中心在发布通知的线程上传递通知。分布式通知中心在主线程上传递通知。有时,您可能需要在您确定的特定线程(而不是通知中心)上发送通知。例如,如果在后台线程中运行的对象正在侦听来自用户界面的通知(例如关闭窗口),则您希望在后台线程而不是主线程中接收通知。在这些情况下,您必须捕获在默认线程上传递的通知,并将其重定向到适当的线程。
| 归档时间: |
|
| 查看次数: |
1208 次 |
| 最近记录: |