Проблемы с созданием эффекта Кена-Бернса - PullRequest
1 голос
/ 08 сентября 2011

В настоящее время я пытаюсь создать эффект Кена Бернса на UIImageView.Сначала он должен увеличивать масштаб (медленно), а после этого didStopSelector объекта Animation должен вызывать метод, который должен уменьшать масштаб.Проблема в том, что первая анимация (увеличение) в порядке и работает отлично, пока я не добавляю didStopSelector к анимации.Если я делаю это, кажется, что метод вызывается напрямую (не после того, как он сделал Stop).

Вот 2 метода, которые включают анимацию:

- (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];
}

После того, как я инициализировал UIImageViewЯ сохраняю текущие значения Transform и Center в свойстве.

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

Я также попробовал сделать это только с одной анимацией и setAnimationAutoReverse, но после завершения анимации она увеличивается без анимации (после медленного анимации с уменьшением).

Может быть, у вас есть идея, в чем может быть проблема.

Заранее спасибо:)

Ответы [ 3 ]

0 голосов
/ 19 сентября 2011

Вы пытались использовать 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 голосов
/ 04 октября 2011

Вы все еще можете использовать блочную анимацию с рекурсией:

В вашем .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];
                             }
                         }];
    }    
}

Таким образомвы создадите переход с рекурсией, и все, что вы будете делать в анимационном блоке, будет происходить снова и снова (вот почему есть значение isOpening YES / NO), пока вы не установите 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.

0 голосов
/ 08 сентября 2011

Что произойдет, если вы вызовете endKenBurnsEffect из основного потока?

т.е. замените [UIView setAnimationDidStopSelector:@selector(endKenBurnsEffect)]; на `[UIView setAnimationDidStopSelector: @selector (invokeEndKenBurnsEffect)]; '

где -(void)invokeEndKenBurnsEffect выглядиткак:

-(void)invokeEndKenBurnsEffect
{
    [ self performSelectorOnMainThread:@selector( endKenBurnsEffect )
                            withObject:nil 
                         waitUntilDone:NO ] ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...