0

我正在使用很多動畫的應用程序:)。 我使用自動佈局來佈置視圖。然後我使用Core Animation進行動畫製作。處理自動佈局和核心動畫之間的衝突

我的問題是在處理自動佈局約束和核心動畫之間的衝突的最佳做法是什麼?

例如,我有約束來指定一個視圖的位置。然後我使用核心動畫將此視圖向下移動100pt。問題在於動畫完成後,Auto Layout約束將該視圖拉回到原始位置。

我在想的是取消激活那些視圖和其他視圖的約束,這些視圖的位置也取決於這個視圖。然後繼續並執行核心動畫的東西。

有什麼想法?我真的很感激。

已更新: 我剛想通了。核心動畫的東西完成後,只需更新約束的常量。

+1

您動畫的約束,而不是位置。請參閱https:// stacko verflow。COM /問題/ 12622424 /怎麼辦 - 我 - 動畫 - 約束的變化。 – kennytm

+0

該職位只是一個例子。我確實使用了自動佈局約束,更改了它們的常量 –

回答

1

假設你的UIView是100x100,以屏幕爲中心。現在你想把它降低50點。對於初學者來說,你有(至少)以下限制:(有一些方法可以讓一個100×100的UIView,這只是一個)

let myCenterX = squareView.centerXAnchor.constraint(equalTo: view.centerXAnchor 
let myCenterY = squareView.centerYAnchor.constraint(equalTo: view.centerYAnchor 
let mySquareSize = squareView.heightAnchor.constraint(equalToConstant: 100) 
let mySquareConstraint = squareView.widthAnchor.constraint(equalTo: squareView.heightAnchor.isActive 
myCenterX.isActive = true = true 
myCenterY.isActive = true = true 
mySquareSize.isActive = true = true 
mySquareConstraint.isActive = true = true 

現在要變化centerYAnchor和動畫:

myCenterY.constant = 100 
UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } 
  • 我假設這個代碼是您的視圖控制器的一部分。第一組可以放在viewDidLoad,至少它是如何寫的。
  • 我試圖做一個快捷方式 - 將isActive = true添加到聲明中。它的內置沒問題,但是Xcode並沒有意識到它是一個NSLayoutConstraint。
  • 將動畫持續時間更改爲任何你想要的。

我已經顯示一個方式 - 使用錨點。但另外兩種做自動佈局的方法(至少詳細聲明NSLayoutConstraint)也可以。 (我真的不知道VFL(視覺格式語言)是否可以處理變化常量 - 我相信它可以。

最主要的是你(1)改變你想要的約束,然後(2)告訴你的視圖。動畫所做的更改

+0

謝謝@dfd。我明白你在說什麼。但我想要的是通過Core Animation進行動畫,而不是Auto Layout Constraint的變化常量。原因是我正在使用RK4 Spring的Spring Animation,而不是Apple提供的UIKit Spring。所以我不能像你展示的那樣在UIView中使用動畫方法。我正在使用來自Flinto的https://github.com/flinto/spring –

-1

你必須改變約束的恆定值,然後動畫視圖

例如:

leadingMenuConstraint.constant = 0; 
[self.view setNeedsUpdateConstraints]; 

[UIView animateWithDuration:0.5f animations:^{ 
    [self.view layoutIfNeeded]; 
}]; 
+0

核心動畫內容如何?這僅適用於使用自動佈局的動畫 –