2016-05-26 12 views
0

Ich versuche eine additive Animation auf den Grenzen eines AVPlayerLayer zu machen. Wenn Sie additive einfach auf YES setzen, wird die Animation unterbrochen. Ich muss es additiv machen, damit die Breite und Höhe mit verschiedenen Animationsparametern animiert werden können. Das Animieren der Schlüsselpfade bounds.size.width und bounds.size.height funktioniert ebenfalls nicht.Wie wird eine additive Animation in AVPlayerLayer-Grenzen verwendet?

Ich kann andere CALayer-Klassen mit dem folgenden Code gut animieren, also frage ich mich, ob AVPlayerLayer einen Bug hat. Hier

ist der Code:

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

Dies ist, wie es aussieht:

enter image description here

Der rote Bereich der Videospiele sein sollte.

Sie können das Beispielprojekt überprüfen ich hier erstellt: https://www.dropbox.com/s/jxuh69wiqdwnuc6/PlayerLayer%20size%20Animation.zip?dl=1

Antwort

0

Der Rahmen Eigenschaft eines CALayer ist eine abgeleitete Eigenschaft, abhängig von der Position, anchor, Grenzen und der Schicht verwandeln. Anstatt den Frame zu animieren, sollten Sie stattdessen die position oder bounds animieren, je nachdem, welchen Effekt Sie erzielen möchten.

Sie können einen Blick auf diese erste nehmen: How to animate the frame of an layer with CABasicAnimation?

und können solche Codes Sie helpul sein:

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

Dies kann auch helfen

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

Der Code in der Frage _ist_ animiert Grenzen, nicht Frame. Das Codebeispiel in der ursprünglichen Frage funktioniert für normale CALayers, daher scheint es eine besondere Eigenart von AVPlayerLayers zu sein. – Hooper

+0

Das Codebeispiel in der ursprünglichen Frage ist auch animierende Grenzen! Weil Sie den Rahmen eines CALayers nicht animieren können! – Stoull