2010-06-22 77 views
1

我製作了一堆個別的小圖片,每張圖片都有一個單獨的CALayer,並且它們應該以不同的速率異步地淡入和淡出。每個都有一個背景子圖層和一個填充子圖層。計時器在後臺運行,在特定時刻單獨爲每個人設置動畫。對於該程序的當前行爲,而不是爲每個單獨的動畫製作動畫,而是圍繞它動畫化整個屏幕。你能幫我做到這一點嗎?它一次只能激活一個圖像?CABasicAnimation在應該只動畫一件東西的時候動畫所有東西

編輯:我應該更清楚。時機不是問題。在我切換到CoreAnimation之前,這些圖像在適當的時候正確地動畫。但是,這裏的主要問題是,當我告訴一個圖像進行動畫製作時,整個屏幕(包括所有圖像之外的屏幕的背景部分)都會生成動畫。

以下代碼段用於在UIView代碼中創建分層結構。 Self指的是主要的UIView。返回值用於爲代表屏幕上這些小圖像之一的類設置CALayer成員變量。

- (CALayer *) createImageLayer:(CGPoint)orig Center:(CGPoint)pos { 
    CALayer *parentLayer = [self layer]; 
    CALayer *childLayer1 = [CALayer layer]; 
    childLayer1.bounds = CGRectMake(0, 0, 40.0f, 40.0f); 
    childLayer1.position = pos; 
    CALayer *childLayer2 = [CALayer layer]; 
    childLayer2.bounds = CGRectMake(0, 0, 40.0f, 40.0f); 
    childLayer2.position = pos; 

    float components[4] = {1.0, 1.0, 1.0, 1.0}; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGColorRef whiteColor = CGColorCreate(colorSpace, components); 

    childLayer1.backgroundColor = whiteColor; 
    childLayer2.backgroundColor = whiteColor; 

    UIImage *childImage = [UIImage imageNamed:@"back.png"]; 
    UIImage *childImage2 = [UIImage imageNamed:@"fill.png"]; 

    CGImageRef imageRef = [childImage CGImage]; 
    CGImageRef imageRef2 = [childImage2 CGImage]; 

    childLayer1.contents=(id)imageRef; 
    childLayer2.contents=(id)imageRef2; 

    [parentLayer addSublayer:childLayer1]; 
    [parentLayer addSublayer:childLayer2]; 

    CGColorSpaceRelease(colorSpace); 
    CGColorRelease(whiteColor); 

    return parentLayer; 
} 

告訴它動畫的代碼。圖像對象被告知將動畫添加到其圖層成員。

- (void) fadeAnimation:(ImageClass *)image { 
    CABasicAnimation *theAnimation; 

    theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"]; 
    theAnimation.duration=1.0; // fixed duration for now 
    theAnimation.repeatCount=1; 
    theAnimation.autoreverses=YES; 
    theAnimation.fromValue=[NSNumber numberWithFloat:1.0]; 
    theAnimation.toValue=[NSNumber numberWithFloat:0.0]; 
    [image.myLayer addAnimation:theAnimation forKey:@"animateOpacity"]; 
} 

回答

0

首先,你的代碼可以很顯著凝結這將使它更容易閱讀:

- (CALayer *) createImageLayer:(CGPoint)orig Center:(CGPoint)pos 
{  
    CALayer *childLayer1 = [CALayer layer]; 
    childLayer1.bounds = CGRectMake(0, 0, 40.0f, 40.0f); 
    childLayer1.position = pos; 

    CALayer *childLayer2 = [CALayer layer]; 
    childLayer2.bounds = CGRectMake(0, 0, 40.0f, 40.0f); 
    childLayer2.position = pos; 

    childLayer1.backgroundColor = [[UIColor whiteColor] CGColor]; 
    childLayer2.backgroundColor = [[UIColor whiteColor] CGColor]; 

    childLayer1.contents=(id)[[UIImage imageNamed:@"back.png"] CGImage]; 
    childLayer2.contents=(id)[[UIImage imageNamed:@"fill.png"] CGImage]; 

    [[self layer] addSublayer:childLayer1]; 
    [[self layer] addSublayer:childLayer2]; 

    return parentLayer; 
} 

接下來,我會建議,而不是創建一個定時器,你只需要使用-performSelector: withObject:afterDelay。然後,您可以一次添加所有動畫,只需交錯afterDelay參數即可。像這樣:

int i = 0; 
for (i = 0; i < 10; ++i) 
{ 
    [self performSelector:@selector(fadeAnimation:) 
       withObject:images[i] 
       afterDelay:(CGFloat)i]; 
} 

其中圖像是您的ImageClass對象的C數組。當然,你不必使用C數組。你可以使用NSArray,但你仍然需要一個計數器來處理afterDelay參數。這會讓您的動畫每一秒都發生錯位。我不確定你想要什麼,所以我只是以此爲例。

還有其他方法可以做到Core Animation所要求的功能。你可以看看動畫分組和屬性,但我認爲上面提到的-peformSelector方法是一條阻力較小的路徑。

致以問候

+0

謝謝你的幫助。我得到的主要問題是,當我想要告訴每個單獨的圖像執行淡入淡出動畫時,例如[self fadeAnimation:myImage],它會將動畫顯示在整個屏幕上,而不會顯示在圖像上。時機對我來說並不是真正的問題,但我可以嘗試一下你的建議,因爲這對我的目的而言似乎比計時器更適合。 – William 2010-06-22 20:43:14