簡體   English   中英

使用CALayer作為子視圖動畫UIView框架

[英]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從動畫中移出?

我想要的是:

我只想動畫它的高度變化,所以我會同時看到viewACAGradientLayer動畫。

您必須了解UIViewCALayer層次結構是不同的。 UIView上運行的布局更改和動畫不會自動影響CALayer層次結構。

因此,如果您希望應用於視圖的更改影響圖層,則必須自行更新。

您的代碼也缺少詳細信息。 例如,您聲稱您看到漸變圖層更改了它的框架,但您沒有顯示更改它的位置。 你有沒有覆蓋layoutSubviews來更新它的frame

默認情況下,更新圖層frame將觸發它的positionbounds屬性的隱式動畫。 要更改動畫的速度,您可以使用:

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

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