2013-07-17 79 views
1

每次我用核心動畫我惹上麻煩!有人可以幫助我解決這個問題嗎?它現在讓我忙了好幾個小時。核心動畫,我的代碼第二次動畫失敗-iOS

我是動畫的圖層的邊界和位置。爲了真正改變模型層,而不僅僅是表示層,我已經知道在開始動畫之前,應該設置位置並且綁定到它們的最終到值

我的代碼創建一個新CALayer -object,然後將其動畫其位置從爲1秒的持續時間這工作正常!

後來,我使用相同的代碼片段將層移回原始位置(A),再次持續1秒。這不是不是工作!圖層確實會向後移動,但由於默認動畫會導致快速的分配位置並綁定到它們的toValue

我真的很想明白我的代碼有什麼問題!是不是排字錯誤?或者我有誤解核心動畫(再次)?

這是我的代碼。第一種方法創建一個新的CALayer對象並將其添加到超級圖層。

-(CALayer*) addLayerFromIm:(UIImage*) im{ 

    CALayer *lay = [CALayer layer]; 
    lay.bounds = CGRectMake(0,0, 100,100); // default values never used 
    lay.position = CGPointMake(0,0); 
    lay.contents = (id) im.CGImage; 
    lay.zPosition = 0; 
    [self.layer addSublayer:lay]; 
    return lay; } 

以下方法添加動畫的層,並且還改變其位置 - 和bounds屬性。

-(CALayer*) animateLayer:(CALayer*) lay fromRect:(CGRect)rcFrom toRect:(CGRect)rcTo duration:(float) duration{ 

    [lay removeAllAnimations]; 

    lay.position = rcTo.origin; 
    lay.bounds = CGRectMake(0,0, rcTo.size.width,rcTo.size.height); 

    CABasicAnimation* animP = [CABasicAnimation animationWithKeyPath:@"position"]; 
    animP.fromValue =[NSValue valueWithCGPoint:rcFrom.origin]; 
    animP.toValue = [NSValue valueWithCGPoint:rcTo.origin]; 
    animP.fillMode = kCAFillModeForwards; 
    animP.duration = duration; 
    animP.beginTime = CACurrentMediaTime(); 
    animP.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
    animP.removedOnCompletion = YES; 
    [lay addAnimation:animP forKey:nil]; 


    CABasicAnimation* animB = [CABasicAnimation animationWithKeyPath:@"bounds"]; 
    animB.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, rcFrom.size.width, rcFrom.size.height)]; 
    animB.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, rcTo.size.width, rcTo.size.height)]; 
    animB.fillMode = kCAFillModeForwards; 
    animB.duration = duration; 
    animB.beginTime = CACurrentMediaTime(); 
    animB.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
    animB.removedOnCompletion = YES; 

    [lay addAnimation:animB forKey:nil]; 

    return lay; } 

這裏是如何的層創建和動畫(這工作正常)

UIImage* imDst = [UIImage imageNamed:@"connectionDst.png"]; 

CALayer *lay = [self animateLayer:[self addLayerFromIm:imDst] fromRect:rcA toRect:rcB duration:1.0]; 

後來,我嘗試了層回遷A.

[self animateLayer:lay fromRect:rcB toRect:rcA duration:1.0]; 

但隨後默認動畫開始並以0.2s移動圖層。我的問題是:我的代碼或我的方法有什麼問題?

回答

0

我會說,這個方法有點奇怪。這看起來像一個自動翻轉的動畫,可以通過CABasicAnimationautoreverses屬性簡單實現。或者你可以嘗試關鍵幀動畫和animateWithDuration:函數UIView