2012-02-22 26 views
0

如何在沒有事務動畫的情況下繪製圖層?例如,當我設置使用CATransaction的層的內容它工作得很好:CGContextDrawImage without Transaction動畫

[CATransaction begin]; 
[CATransaction setValue:(id)kCFBooleanTrue 
       forKey:kCATransactionDisableActions]; 
myLayer.contents = (id)[[imagesTop objectAtIndex:Number]CGImage]; 
[CATransaction commit]; 

,但我需要從委託方法[myLayer setNeedsDisplay]改變內容。下面是代碼:

-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGContextDrawImage(context, rect, Image.CGImage]);  
} 
+0

你是什麼層的代表同樣的效果? – sch 2012-02-22 16:54:58

回答

2

CALayer實現setNeedsDisplay方法:

調用此方法將導致接收器重新緩存的內容。這將導致圖層接收到drawInContext:,這可能導致代表收到displayLayer:drawLayer:inContext:消息。

...和displayIfNeeded

當接收層將調用display如果它已被標記爲需要顯示此消息。

如果您將[myLayer displayIfNeeded]換成CATransaction,則可以關閉隱式動畫。

+0

對不起,但我需要強制重繪,不僅如果需要 – Andrew 2012-02-22 17:36:41

+1

首先你要將圖層標記爲需要重繪('[myLayer setNeedsDisplay]')。然後你告訴它如果需要重繪('[myLayer displayIfNeeded]')。由於您已將圖層標記爲需要重新繪製,因此會立即重繪。請參閱上面引用的「displayIfNeeded」的文檔。 – Costique 2012-02-22 17:41:36

+0

它工作得很棒 – Andrew 2012-02-23 14:23:47

1

你也可以繼承CALayer和覆蓋actionForKey:

- (id <CAAction>) actionForKey: (NSString *) key 
{ 
    if ([key isEqualToString: @"contents"]) 
     return nil; 
    return [super actionForKey: key]; 
} 

此代碼禁用內置的動畫爲contents財產。

或者,您也可以實現通過實施層的委託方法

- (id <CAAction>) actionForLayer: (CALayer *) layer forKey: (NSString *) key 
{ 
    if (layer == myLayer) { 
     if ([key isEqualToString: @"contents"]) 
      return nil; 
     return [[layer class] defaultActionForKey: key]; 
    } 
    return [layer actionForKey: key]; 
}