[英]Animate UIView frame with CALayer as subview
我有的:
我有一個UIView's
層次結構和一個CAGradientLayer
,我用它來設置這個層次結構的“背景顏色”。 所以我有這樣的事情:
ViewA - > ViewB - > CAGradientLayer
我在做什么:
有一次,我想為ViewA的frame
(只有它的高度)設置動畫。 所以它會是這樣的:
[UIView animateWithDuration:timeInterval
delay:0
options:UIViewAnimationOptionCurveEaseIn
animations:^{
viewA.frame = newFrame;
}];
問題:
這個問題是CAGradientLayer
不會為它的框架設置動畫,它只是改變它的框架,然后viewA開始按預期動畫(通過將模擬器設置為慢動作動畫可以清楚地看到這一點)。
我嘗試了什么:
我嘗試在這里做了蘋果推薦的東西 ,在UIView
動畫塊里面做了,但它實際上沒有用,因為我仍然在這里動畫框架:
viewA.frame = newFrame;
我也明白我應該為邊界設置動畫,而不是CALayer
的框架,問題在於,我如何設置邊界的動畫,並且當動畫ViewA的框架動畫時,將CALayer
從動畫中移出?
我想要的是:
我只想動畫它的高度變化,所以我會同時看到viewA
和CAGradientLayer
動畫。
您必須了解UIView
和CALayer
層次結構是不同的。 在UIView
上運行的布局更改和動畫不會自動影響CALayer
層次結構。
因此,如果您希望應用於視圖的更改影響圖層,則必須自行更新。
您的代碼也缺少詳細信息。 例如,您聲稱您看到漸變圖層更改了它的框架,但您沒有顯示更改它的位置。 你有沒有覆蓋layoutSubviews
來更新它的frame
?
默認情況下,更新圖層frame
將觸發它的position
和bounds
屬性的隱式動畫。 要更改動畫的速度,您可以使用:
[CATransaction begin];
[CATransaction setAnimationDuration:10.0];
_myLayer.frame = newFrame;
[CATransaction commit];
首先,請閱讀此內容 。
嘗試顯式封裝視圖動畫代碼和圖層動畫。 不要指望圖層自動動畫。 由於您正在處理定位,因此您需要更改graidentlayer.bounds
。
如果這不起作用,請在動畫代碼之前嘗試:
[CATransaction begin];
[CATransaction setDisableActions: NO];
[CATransaction commit];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.