我有一个动画可以为视图的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)
答案 0 :(得分:5)
尝试在主线程上触发通知
DispatchQueue.main.async {
NotificationCenter.default.addObserver(self, selector: #selector(self.showResult), name: NSNotification.Name(rawValue: "SHOWRESULT"), object: nil)
}
<强>原因:强>
常规通知中心在线程中发送通知 通知已发布。分布式通知中心 在主线程上发送通知。有时,您可能需要 要在特定线程上传递的通知 由您而不是通知中心确定。例如,如果 在后台线程中运行的对象正在侦听 来自用户界面的通知,例如窗口关闭,您 想在后台线程中收到通知 而不是主线程。在这些情况下,你必须抓住 通知,因为它们是在默认线程和重定向上传递的 他们到适当的线程。
答案 1 :(得分:1)
在showResult
方法下修改了Tr:
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
)
}
}
答案 2 :(得分:1)
在我的情况下,我在按钮水龙头上有一个闭合按钮,点击该按钮时需要对颜色进行动画处理。经过数小时的无奈之后,调用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
})
}
}