2017-08-03 26 views
1

我必須動畫幾個UIView我已經添加在UIStoryboard內的UIViewController。我已經附加了適當的約束,以便他們將始終以我正在尋找的方式可見。這可以。當應用約束時,動畫視圖的正確方式是什麼?

我正在使用https://github.com/satoshin21/Anima庫來根據我的需要爲這些視圖設置動畫。

但問題是,他們沒有按預期的方式工作,他們不是在一個方向或位置應該是動畫。我相信這是因爲我所應用的限制。

即使應用約束條件,實現此目的的最佳方法是什麼?

設置,myView.translatesAutoresizingMaskIntoConstraints = true在控制檯中出現大量警告消息。

P.S.我知道以NSLayoutConstraints的形式引用約束,但這不是我正在看的,因爲上面的庫僅僅提供了良好的鏈接函數,儘管我們可以在不引用約束的情況下執行它。

+1

你能提供一些代碼,並給予更多的詳細說明_not動畫方向或位置應該是_? – clemens

+1

@macmoonshine,我正在爲動畫編寫試驗和錯誤代碼。沒關係。我可以重寫代碼,但是我看到的答案是我現在正在做的是正確與否,如果不是,那麼應該怎麼做纔是正確的做法。我不需要代碼。我需要一個想法。 *是的,我和我將永遠是初學者,就好像我總是愛好者學習新事物一樣。*我的名譽已經是我所知道的了。 – Hemang

回答

0

這裏的問題是,NSLayoutConstraint切換的作用就像屬性,它們不過是可以打開/關閉的值,而是通過玩這個切換和其他可能的值來引用。不幸的是,沒有真正的方法可以解決這個問題,而且事實上,我自己已經構建了一個類似於Anima的小型庫,如果您尊重NSLayoutConstraints的性質,它的工作方式會非常好。

這樣做的證據是,在這個Anima庫的引擎下,它只是存儲在鏈內(在Enum值實際內部)聲明的動畫點,並在動畫移動時應用它們。無論如何,當使用NSLayoutConstraints時,永遠不應該將translatesAutoResizingMaskIntoConstraints重新設置爲true。 第二個原因是約束條件是所有iOS框架操作的基礎,包括.frame和動畫(這就是爲什麼Anima從外觀上看起來效果很好)。 我最近寫了一篇關於這個post,但我通過引用蘋果解釋:

你的問題是,當translatesAutoresizingMaskIntoConstraints被稱爲 ,像.frame方法或.frame.size被忽略/重寫 (視當你使用它們時,在 之前或之後translatesAutoresizingMaskIntoConstraints)。如Apple所述:

請注意,自動調整掩碼約束條件完全指定了視圖的大小和位置的 ;因此,您不能添加其他約束來修改此大小或位置而不引入衝突。如果 想要使用自動佈局來動態計算視圖的大小和位置 ,則必須將此屬性設置爲false,然後爲該視圖提供一個不含混淆且不衝突的約束集合。

修訂 ,否則儘量不要設置translatesAutoResizingMaskIntoConstraints爲true的這些觀點,通過這樣做,你基本上是告訴你的控制器無視你的約束,並嘗試基於該.frame或.frame申請限制。尺寸或位置值設置在UIView上。因此,使您的自定義約束過時。如果通過停止這個,你仍然會遇到問題,這可能是一個約束值問題,其中我不能給你提供更多的建議,而不幸的是沒有任何代碼。

0

首先,如果您已經在視圖上設置了合適的約束條件,則不應將translatesAutoresizingMaskIntoConstraints設置爲true。將此屬性設置爲true將向視圖添加更多約束,從而導致衝突。

與約束動畫一般的代碼是

aConstraint.constant = 1234 
anotherConstraint.isActive = false 
thirdConstraint.isActive = true // thirdConstraint replaces anotherConstraint 
UIView.animatewithDuration: 0.25) { 
    self.view.layoutIfNeeded() 
} 

希望這有助於。 ;)

0

我的解決方案是去除那個UIViewController的約束,並根據我的需要以編程方式設置框架。這工作正常,並且不需要使用AutoLayout來完成這種不規則的事情。

相關問題