[英]UIView.animate not work correctly in 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)
嘗試在主線程上觸發通知
DispatchQueue.main.async {
NotificationCenter.default.addObserver(self, selector: #selector(self.showResult), name: NSNotification.Name(rawValue: "SHOWRESULT"), object: nil)
}
原因:
常規通知中心在發布通知的線程上發送通知。 分布式通知中心在主線程上傳遞通知。 有時,您可能需要在由您而不是通知中心確定的特定線程上傳遞通知。 例如,如果在后台線程中運行的對象正在偵聽來自用戶界面的通知,例如窗口關閉,您希望在后台線程而不是主線程中接收通知。 在這些情況下,您必須捕獲在默認線程上傳遞的通知並將它們重定向到適當的線程。
在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
)
}
}
在我的例子中,我有一個關閉按鈕點擊,點擊時需要動畫顏色。 經過數小時的挫折,在 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
})
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.