2011-04-08 98 views
3

我有一個CALayer子類,它受限於父層的寬度,但是具有固定的高度。我想隱式動畫禁用調整窗口的大小,但每當我設置圖層的高度時啓用。選擇性覆蓋CALayer隱式動畫

要禁用動畫時,窗口大小我設置圖層的行動

NSMutableDictionary *actions = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[NSNull null], @"bounds", [NSNull null], @"position", nil]; 

,這似乎工作。然後,我已經覆蓋了actionForKey:方法我的層子

- (id<CAAction>)actionForKey:(NSString *)event 
{ 
    if ([event isEqualToString:@"frame.size.height"]) { 
     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"frame.size.height"]; 
     [animation setDuration:0.5f]; 
     return animation; 
    } 
    return nil; 
} 

但後來當我改變我的層的高度與

[layer setValue:[NSNumber numberForFloat:50.0] forKey:@"frame.size.height"]; 

高度的變化,但沒有設置動畫。我看到了使用frame.size.height調用的actionForKey:方法,但不管我返回的是否都是動畫。如果我沒有設置動作,或者有actionForKey:方法,那麼高度動畫正確,但是窗口大小調整也是動畫的,我不想要。另外,也許我誤解了,但我認爲從actionForKey返回nil:會使默認動畫運行,但它似乎即使存在的方法停止所有隱式動畫(無論操作字典設置與否)。

我在這裏錯過了什麼,我會很感激任何指針。

回答

3

你的子類將得到actionForKey:爲每個鍵調用它,所以如果你返回nil,那麼將不會有該鍵的動作。如果您需要默認動畫,則應返回[super actionForKey:event][CALayer defaultActionForKey:event]。 。

圖層的frame從其boundsposition計算,所以如果沒有動畫,這兩個,還有不能成爲frame動畫*

你想要做的是:

[CATransaction setValue:kCFBooleanTrue 
       forKey:kCATransactionDisableActions] 

當您的圖層因調整窗口大小而調整大小時。這將僅在此時禁用動畫(對於此事務);當你直接改變圖層的大小時,它仍然會動畫。我不確定這個電話的正確位置是什麼;我只是試圖通過窗口正在調整大小的通知進行回調,但沒有奏效。我相信,要弄清楚將代碼放在哪裏並不難。


*:其實,文檔說:

注:框架屬性不是直接動畫。相反,您應該爲邊界,anchorPoint和位置屬性的適當組合設置動畫效果,以獲得所需的結果。

+0

謝謝,掃清事情了。我結束了CAConstraintsLayoutManager的子類化並禁用了layoutSublayersOfLayer:方法中的操作。它似乎工作,但我不知道這是否是最好的方式來做到這一點。 – iain 2011-04-08 17:28:23

+0

關於正確的聲音。我讓我的觀點本身採用'CALayoutManager'協議來做一個相關的,稍微簡單的案例。很高興我能幫上忙。 – 2011-04-08 17:37:25

+1

它看起來也適用於禁用父圖層的layoutSublayers方法中的操作。 – iain 2011-04-08 17:41:44

1

有,他們說..幾種方法對皮膚這隻貓 ...我覺得最簡單的是一個......通過在層的「操作」字典設置一些條目..

CALayer *stopAnimatingLikeThat = CALayer.new; 
stopAnimatingLikeThat.actions = 
    @{ @"position":NSNull.null, @"bounds":NSNull.null }; 

這將停止惱人的「卡在蜜」「隱式動畫」上界的變化等等

+0

這是一個很好的方法來做到這一點,因爲你可以設置你的CALayer在初始化時不調整位置和邊界。 – 2013-07-10 08:15:32

+0

在沒有隱式動畫的情況下重繪圖層中的文本'yourLayer.actions = @ {@「contents」:NSNull.null};' – 2013-08-30 02:08:55