簡體   English   中英

UIView.animate 無法在 swift 中正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM