2016-05-26 6 views
0

Я пытаюсь сделать аддитивную анимацию на границах AVPlayerLayer. Просто устанавливая добавку в YES, она разбивает анимацию. Мне нужно сделать эту добавку так, чтобы ширина и высота могли быть анимированы с различными параметрами анимации. Анимация ключевых путей bounds.size.width и bounds.size.height также не работает.Как использовать аддитивную анимацию на границах AVPlayerLayer?

Я могу анимировать другие классы CALayer в порядке с приведенным ниже кодом, поэтому я начинаю задаваться вопросом, есть ли у AVPlayerLayer ошибка.

Вот код:

AVPlayerLayer *vl; 

// ... 


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    NSURL *path = [[NSBundle mainBundle] URLForResource:@"vid" withExtension:@"mp4"]]; 
    AVPlayer *player = [AVPlayer playerWithURL: path]; 
    vl = [AVPlayerLayer playerLayerWithPlayer:player]; 
    vl.videoGravity = AVLayerVideoGravityResize; 
//  vl = [CALayer layer]; // a normal calayer animates properly 

    vl.backgroundColor = [NSColor redColor].CGColor; 
    vl.frame = CGRectMake(200,100,150,100); 
    [_window.contentView.layer addSublayer:vl]; 
} 

- (IBAction)animate:(id)sender { 
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"]; 
    animation.fromValue = [NSValue valueWithRect:CGRectMake(0,0,0, 0)]; 
    animation.toValue = [NSValue valueWithRect:CGRectMake(0,0,240, 60)]; 
    animation.duration = 4; 
    animation.additive = YES; 

    [vl addAnimation:animation forKey:nil]; 
} 

Это то, что он выглядит следующим образом:

enter image description here

Красная площадь должна быть видео игры.

Вы можете проверить пример проект, который я создал здесь: https://www.dropbox.com/s/jxuh69wiqdwnuc6/PlayerLayer%20size%20Animation.zip?dl=1

ответ

0

Свойством каркасов CALayer является производным свойством, в зависимости от положения, anchorPoint, оценка и преобразование слоя. Вместо того, чтобы анимировать фрейм, вы должны вместо этого оживить position или bounds, в зависимости от того, какой эффект вы пытаетесь выполнить.

Вы можете сначала посмотрим на это:

Q: When I try to animate the frame of a CALayer nothing happens. Why?

Это может также помочь: How to animate the frame of an layer with CABasicAnimation?

И те, код может быть Каталог путешествий Вам:

NSURL *fileUrl = [NSURL fileURLWithPath:@"yourFilePath"]; 
AVPlayer *player = [[AVPlayer alloc] initWithURL:fileUrl]; 

CALayer *superlayer = self.view.layer; 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 
[superlayer addSublayer:playerLayer]; 

[player play]; 

playerLayer.videoGravity = AVLayerVideoGravityResize; 
playerLayer.frame = CGRectMake(10, 200, 320, 200); 
playerLayer.position = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2); 

CGRect startBounds = CGRectMake(10, 200, 200, 150); 
CGRect endBounds = CGRectMake(10, 200, 320, 200); 

CABasicAnimation * sizeAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"]; 

sizeAnimation.fromValue = [NSValue valueWithRect:startBounds] ; 
sizeAnimation.toValue = [NSValue valueWithRect:endBounds] ; 
sizeAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
sizeAnimation.duration = 4; 

[playerLayer addAnimation:sizeAnimation forKey:@"bounds"]; 
+1

Кодекса в вопросе _is_ анимация границ, а не кадр. Пример кода в исходном вопросе работает для обычных CALayers, поэтому он кажется причудой, характерной для AVPlayerLayers. – Hooper

+0

Пример кода в исходном вопросе также анимирует границы! Потому что вы не можете анимировать рамку CALayer! – Stoull

Смежные вопросы