2017-09-04 29 views
0

我有幾個組件需要動畫。我一直在使用UIVIew.animate()很長一段時間沒有問題。但是在這種情況下,其中一個組件不具有動畫效果(特別是pullUpViewBottomCSTR),它只是將視圖「跳」到沒有動畫的位置(而其餘的按預期工作)。動畫不適用於所有視圖(iOS)

你可以提供任何可能的解釋(因爲它可能是垃圾複製粘貼一切)。我很困惑。

UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseOut, animations: { 

      self.pullUpViewBottomCSTR!.constant = 0 
      self.mainImagePullUpBottomCSTR.constant = 0 

      self.obscuringFadeEffectView.alpha = 0; 

      self.layoutIfNeeded() 
     }) { (completed) in 
      // 
     } 
  1. 我不認爲我有到位的任何衝突的約束。

  2. 此代碼位於UIView組件中,而不是UIViewController

  3. 我將這個組件加載到viewController中。我曾經在UIViewController中擁有所有的東西,我認爲它一直正常工作,直到我將它移動到相應的.xib和.swift文件。

更新:

約束最初加入如下。

self.pullUpViewBottomCSTR = parentController.view.bottomAnchor.constraint(equalTo: self.bottomAnchor) 
    self.pullUpViewBottomCSTR!.isActive = true; 
    self.pullUpViewBottomCSTR!.constant = 0 

我後來用盤式識別器,並根據需要進行更新的約束(這可能是相關的)(這就是爲什麼即時通訊保持對它的引用)。

+0

嘗試寫self.view.layoutIfNeeded() –

+0

當前組件是一個UIView,而不是一個UIViewController 我已經嘗試做到以下幾點:self.pullupView.layoutIfNeeded()。似乎沒有工作。我希望我不會這樣做,因爲我已經在superview上做self.layoutIfNeeded()。但在任何情況下,其不幸的是沒有改變任何東西:/ –

+0

檢查約束的初始值(應該是0) –

回答

2

你綁到動畫的看法是self但它的垂直位置由該約束控制:

self.pullUpViewBottomCSTR = parentController.view.bottomAnchor.constraint(equalTo: self.bottomAnchor) 

當您激活這個約束帶:

self.pullUpViewBottomCSTR!.isActive = true 

它被添加到限制爲最早的共同祖先selfparentController.view(如果一個人是另一個人的直系後代,這可能是其中一種觀點)。爲了製作該約束,您需要在該最早的共同祖先上調用layoutIfNeeded()

您還沒有表現出如何通過self代表的觀點是關係到parentController.view,但假設它是視圖的subview,那麼你就可以製作動畫:

self.superview?.layoutIfNeeded() 

動畫循環內。

或者:

parentController.view.layoutIfNeeded() 

應該正常工作。

+0

這工作。我非常渴望瞭解爲何如此。動畫發生在UIView內部,所有涉及的子視圖都包含在裏面。爲什麼需要調用superview(在本例中是UIViewController)? 非常感謝您抽出寶貴時間,如果您能指出我正確的方向,以便我能理解爲什麼我正在做我在這裏做的事情,我將非常感激。 再次感謝。 –

+0

我修改了答案以提供更好的解釋。 – vacawama