2011-09-08 60 views
1

我正在嘗試在UIImageView上創建Ken Burns effect。它首先應該放大(慢),之後,動畫的didStopSelector應該調用一個方法,該方法應該縮小。問題是,只要我不將didStopSelector添加到動畫中,第一個動畫(放大)就可以並且完美地工作。如果我這樣做,似乎直接調用方法(不是在它停止之後)。創建Ken-Burns效果的問題

這裏有2種方法,其中包括動畫:我初始化的UIImageView

- (void)beginKenBurnsEffect { 

    [UIView beginAnimations:@"a" context:self.view_image]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:5]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDidStopSelector:@selector(endKenBurnsEffect)]; 
    [UIView setAnimationDelegate:self]; 


    self.view_image.transform = CGAffineTransformScale(self.view_image.transform, 1.06, 1.06); 
    self.view_image.center = CGPointMake(self.frame.size.width/1.7, self.frame.size.height/2); 

    [UIView commitAnimations]; 
} 

- (void)endKenBurnsEffect { 

    [UIView beginAnimations:@"b" context:self.view_image]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:5]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDidStopSelector:@selector(beginKenBurnsEffect)]; 
    [UIView setAnimationDelegate:self]; 

    self.view_image.transform = self.origTransform; 
    self.view_image.center = self.origPoint; 

    [UIView commitAnimations]; 
} 

後,我保存當前變換和中心值的屬性。

self.origTransform = self.view_image.transform; 
self.origPoint = self.view_image.center; 

我也只有一個動畫和setAnimationAutoReverse試了一下,但動畫完成後,就會放大,在沒有動畫(之後它沒有縮小慢慢動畫)。

也許你有一個想法是什麼問題。

預先感謝您:)

回答

0

您是否嘗試過使用CAAnimationGroup和使用一些CAAnimations?

NSMutableArray * animations = [ NSMutableArray array ] ; 
{ 
    CAAnimation * anim = [ CABasicAnimation animationWithKeyPath:@"transform" ] ; 
    anim.fromValue = [ NSValue valueWithCGAffineTransform:CGAffineTransformScale(...) ] ; 
    [ array addObject:anim ] ; 
} 
{ 
    CAAnimation * anim = // make intro position transform 
    [ array addObject:anim ] ; 
} 

{ 
    CAAnimation * anim = // make outro position transform for layer.transform 
    anim.offset = 5.0; 
} 

{ 
    CAAnimation * anim = // make outro position transform for layer.position 
    anim.offset = 5.0; 
} 

CAAnimationGroup * group = [ CAAnimationGroup animation ] ; 
group.animations = animations ; 

[ CATransaction begin ] ; 
[ self.view.layer addAnimation:group forKey:nil ] ; 
[ CATransaction commit ] ; 

...這只是一個粗略的草稿

+0

所以這個工作? – nielsbot

0

,如果你從你的主線程中調用endKenBurnsEffect會發生什麼?

即將[UIView setAnimationDidStopSelector:@selector(endKenBurnsEffect)];更改爲`[UIView setAnimationDidStopSelector:@selector(invokeEndKenBurnsEffect)];'

其中-(void)invokeEndKenBurnsEffect樣子:

-(void)invokeEndKenBurnsEffect 
{ 
    [ self performSelectorOnMainThread:@selector(endKenBurnsEffect) 
          withObject:nil 
         waitUntilDone:NO ] ; 
} 
+0

感謝您的回答。但它似乎並沒有解決這個問題。有時效果工作,如果我註釋setAnimationBeginsFromCurrentState線。但這並不是很確定,如果我重新啓動應用程序,它有時會表現得很糟糕。接下來的問題是,我不知何故必須停止動畫,但我沒有看到效果可靠的效果解決方案。你有沒有想法? –

0

你仍然可以使用基於塊的動畫與遞歸:

在您的.h文件中

@interface YourClass : UIViewController{ 
    BOOL kenBurnsIsAnimating; 
} 

在你。 m文件

- (void)viewDidLoad{ 
    kenBurnsIsAnimating = YES; 
    [self kenBurns:YES]; 
} 

- (void)kenBurns:(BOOL)isOpening{ 
    if (kenBurnsIsAnimating) { 
     [UIView animateWithDuration:5.0 
           delay:1.0 
          options:UIViewAnimationCurveEaseInOut 
         animations:^{ 
          if (isOpening) { 
           // do your opening animation (zoom in and panning) 
          }else{ 
           // do your closing animation (zoom out and panning) 
          } 
         } 
         completion:^(BOOL finished){ 
          if (finished) { 
           [self kenBurns:!isOpening]; 
          } 
         }]; 
    }  
} 

這種方式你將創建與遞歸的過渡和任何你會做的動畫塊將會一遍又一遍地發生(這就是爲什麼有開啓是/否值),直到你不會設置kenBurnsIsAnimating爲NO。但是,目前的動畫仍然需要完成。

有關基於塊的動畫檢出的更多信息http://developer.apple.com/library/IOS/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html#//apple_ref/doc/uid/TP40009503-CH6-SW4還有一個將兩個基於塊的動畫相互連接的示例。清單4-2。