Делегат Core Animation не вызван - PullRequest
2 голосов
/ 01 августа 2010

Я, должно быть, делаю что-то не так, очевидно. Мой делегат не вызывается, когда я устанавливаю фрейм представления.

Рамочная версия НЕ работает

-(void)someMethod {
    CAAnimation *anim = [CABasicAnimation animation];
    [anim setDelegate:self];
    [[currentViewController view] setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"frame"]];
    [[newViewController view] setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"frame"]];

    [[[currentViewController view] animator] setFrame:currentTarget];
    [[[newViewController view] animator] setFrame:newTarget];
}

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag {
    NSLog(@"Yep; works!");
}

Довольно странно; работает тот же код с использованием alphaValue:

-(void)someMethod {
    CAAnimation *anim = [CABasicAnimation animation];
    [anim setDelegate:self];
    [[currentViewController view] setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"alphaValue"]];
    [[newViewController view] setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"alphaValue"]];

    [[[currentViewController view] animator] setAlphaValue:0.5];
    [[[newViewController view] animator] setAlphaValue:0.5];
}

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag {
    NSLog(@"Yep; works!");
}

Можете ли вы сказать мне, что мне здесь не хватает? Я просто не понимаю. Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Ваш метод делегата может быть запущен с использованием аниматора для установки вашего кадра.Для этого вы добавляете анимации для ключей frameSize и frameOrigin отдельно:

-(void)someMethod {
    CAAnimation *anim = [CABasicAnimation animation];
    [anim setDelegate:self];

    [[currentViewController view] setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"frameOrigin"]];
    [[currentViewController view] setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"frameSize"]];
    [[newViewController view] setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"frameOrigin"]];
    [[newViewController view] setAnimations:[NSDictionary dictionaryWithObject:anim forKey:@"frameSize"]];

    [NSAnimationContext beginGrouping];
    [[[currentViewController view] animator] setFrame:currentTarget];
    [[[newViewController view] animator] setFrame:newTarget];
    [NSAnimationContext endGrouping];
}

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag {
    NSLog(@"Yep; works!");
}

В этом примере ваш метод делегата будет запускаться для каждой из четырех анимаций.Если вы перемещаете представление без изменения размера, вам не нужна анимация frameSize.

1 голос
/ 02 августа 2010

Вы используете аниматор или , вы используете явную анимацию. В вашем случае, поскольку вы хотите, чтобы вызывался -animationDidStop , не используйте аниматор. Кроме того, вы не должны пытаться анимировать кадр в явной анимации . Либо анимируйте границы , либо анимируйте позицию, либо вы можете анимировать оба, добавив оба к слою вашего вида. Измените свой код на что-то вроде этого:

-(void)someMethod
{
    CABasicAnimation *boundsAnim = 
                        [CABasicAnimation animationWithKeyPath:@"bounds"];
    [boundsAnim setDelegate:self];
    [boundsAnim setFromValue:[NSValue valueWithRect:currentTarget]];
    [boundsAnim setToValue:[NSValue valueWithRect:newTarget]];

    CABasicAnimation *positionAnim = 
                        [CABasicAnimation animationWithKeyPath:@"position"];
    [positionAnim setDelegate:self];
    [positionAnim setFromValue:[NSValue valueWithPoint:currentPosition]];
    [positionAnim setToValue:[NSValue valueWithRect:newPosition]];

    [[[currentViewController view] layer] addAnimation:boundsAnim forKey:nil];
    [[[currentViewController view] layer] addAnimation:positionAnim forKey:nil];
}

Поскольку это OSX, вам необходимо убедиться, что слой вашего представления имеет слой с резервной копией. Вы делаете это по телефону:

[[currentViewController view] setWantsLayer:YES];
...