2009-12-10 63 views
2

這是我的第一個問題她所以請溫柔: 我有模擬器以及真正的設備上運行順暢的動畫代碼(我在iPhone 3GS 3.1.2上測試) 。 動畫是2個視圖之間的簡單轉換,類似於書頁翻頁。iPhone動畫問題模擬器vs真實設備

模擬器和真實設備之間的一個區別(我無法調查的問題 - 解決的問題)是在動畫完成時 - 在旋轉完成後動畫視圖閃爍(顯示一秒鐘)隱藏起來。在模擬器上,這種「意外」閃爍不會發生。

這裏是動畫代碼:

-(void)flip{ 
    UIView *animatedView; 

    // create an animation to hold the page turning 
    CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    transformAnimation.removedOnCompletion = NO; 
    transformAnimation.delegate = self; 
    transformAnimation.duration = ANIMATION_TIME; 
    transformAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 

    // this is the basic rotation by 90 degree along the y-axis 
    CATransform3D endTransform = CATransform3DMakeRotation(3.141f/2.0f, 
                  0.0f, 
                  -1.0f, 
                  0.0f); 
    // these values control the 3D projection outlook 
    endTransform.m34 = 0.001f; 
    endTransform.m14 = -0.0015f; 


    // start the animation from the current state 
    transformAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; 
    transformAnimation.toValue = [NSValue valueWithCATransform3D:endTransform]; 
    animatedView = screenShot; 

    // Create an animation group to hold the rotation and possibly more complex animation in the future 
    CAAnimationGroup *theGroup = [CAAnimationGroup animation]; 

    // Set self as the delegate to receive notification when the animation finishes 
    theGroup.delegate = self; 
    theGroup.duration = ANIMATION_TIME; 
    // CAAnimation-objects support arbitrary Key-Value pairs, we add the UIView tag 
    // to identify the animation later when it finishes 
    [theGroup setValue:[NSNumber numberWithInt:animatedView.tag] forKey:@"animated"]; 
    // Here you could add other animations to the array 
    theGroup.animations = [NSArray arrayWithObjects:transformAnimation,nil]; 
    theGroup.removedOnCompletion = NO; 
    // Add the animation group to the layer 
    if (animatedView.layer.anchorPoint.x != 0.0f) 
    { 
     animatedView.layer.anchorPoint = CGPointMake(0.0f, 0.5f); 
     float yy = animatedView.center.x - (animatedView.bounds.size.width/2.0f); 
     animatedView.center = CGPointMake(yy, animatedView.center.y); 
    } 

    if(![animatedView isDescendantOfView:self.view])[self.view addSubview:animatedView]; 
    screenShot.hidden = NO; 
    animatedView.hidden = NO; 


    [animatedView.layer addAnimation:theGroup forKey:@"flip"]; 

} 

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag { 

    screenShot.hidden = YES; 

} 

回答

5

嘗試theGroup的和/或transformAnimation的在fillMode設置爲kCAFillModeForwards:

theGroup.fillMode = kCAFillModeForwards; 

這應當引起你的動畫堅持一旦其活動期間完成。我已經使用它來刪除之前的動畫結束閃爍。

+1

值得一提: 它似乎只適用於當與其一起使用時: theGroup.removedOnCompletion = NO; – Lukasz 2009-12-11 06:16:19

0

不知道我完全你所看到的理解,但它是可能的,你所看到的所造成的設備和仿真器之間的速度差的東西。模擬器比設備快得多,所以非常快速地「閃爍」的東西可能太快,以至於人眼無法接近模擬器。

0

OOF。這很煩人。我認爲在動畫停止和執行代碼行之間有一瞬間的時間間隔。如果只有animationWillStop:方法!你可以試試,而不是screenShot.hidden = YES,screenShot.alpha = 0。我懷疑這會對速度有所影響,但它可能值得一試?您也可以將視圖淡入視爲動畫的一部分,但我認爲您不希望這樣做。

我能想到的唯一的另一件事是在動畫時間之後設置一個NSTimer間隔。例如:

[NSTimer scheduledTimerWithTimeInterval:(ANIMATION_TIME - .001) target:self selector:@selector(hideTheView) userInfo:nil repeats:NO]; 

然後實施那個hideTheView方法,當然。

+0

謝謝! - 與screenShot.alpha = 0的技巧不起作用。 但是 - 與NSTmer的作品。但是 - 這個解決方案似乎並不優雅,我不相信每個改變UIview位置的動畫都應該實現這一點。 無論如何,我很高興它至少能工作 - 至少我知道應該在哪個方向尋找答案。謝謝 - 我沒有足夠的聲望點投票給這個答案,簡單的感謝你一定是足夠的momemt ;-) – Lukasz 2009-12-11 05:07:34