Animer la propriété AVG VividLayer videoGravity

J'essaie de copyr le comportement d'Apple dans la lecture video qui permet à l'user d'étirer l'image video pour remplir les limites.

@interface FHVideoPlayerView : UIView @end @interface FHVideoPlayerView + (Class)layerClass { return [AVPlayerLayer class]; } - (void)setAspectMode:(FHVideoPlayerAspectMode)aspectMode animated:(BOOL)animated { FHVideoPlayerAspectMode current = [self aspectMode]; FHVideoPlayerAspectMode final = aspectMode; NSSsortingng *fromValue; NSSsortingng *toValue; AVPlayerLayer *layer = (AVPlayerLayer *)[self layer]; switch (current) { case FHVideoPlayerAspectFill: fromValue = AVLayerVideoGravityResizeAspectFill; break; case FHVideoPlayerAspectFit: fromValue = AVLayerVideoGravityResizeAspect; break; default: break; } switch (final) { case FHVideoPlayerAspectFill: toValue = AVLayerVideoGravityResizeAspectFill; break; case FHVideoPlayerAspectFit: toValue = AVLayerVideoGravityResizeAspect; break; default: break; } if (toValue != fromValue) { if (animated == YES) { // Manually added CABasicAnimation based on the understanding the implicit animations are disabled for CALayers that back a UIView CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"videoGravity"]; [layer addAnimation:animation forKey:@"animateVideoGravity"]; [CATransaction begin]; [CATransaction setAnimationDuration:0.333]; } [layer setVideoGravity:toValue]; if (animated == YES) { [CATransaction commit]; } } } 

Cela fonctionne très bien lorsque j'essaie d'animer une propriété numérique telle que l'opacité. Mais, vous remarquerez à partir de la reference de class, la propriété videoGravity d'AVPlayerLayer est un NSSsortingng. La reference de class indique qu'elle est animable.

Donc ma question est: Comment !?

Je crois que ceci est probablement lié d'une manière ou d'une autre à la propriété de contenu de CALayer et possiblement à ContentGravity.

Comme l'a fait remarquer voromax, il s'agit d'un bug dans iOS 5.0. J'ai inversé ingénierie -[AVPlayerLayer setVideoGravity:] mise en œuvre dans iOS 5.1 afin de comprendre comment l'animation était censée fonctionner. Voici comment contourner le bug et avoir une belle animation sur iOS 5.0.

 @implementation VideoPlayerView + (Class) layerClass { return [AVPlayerLayer class]; } - (AVPlayerLayer *) playerLayer { return (AVPlayerLayer *)[self layer]; } - (NSSsortingng *) videoGravity { return self.playerLayer.videoGravity; } - (void) setVideoGravity:(NSSsortingng *)videoGravity { self.playerLayer.videoGravity = videoGravity; // Workaround a bug in iOS 5.0 float avFoundationVersion = [[[NSBundle bundleForClass:[AVPlayerLayer class]] objectForInfoDictionaryKey:(NSSsortingng *)kCFBundleVersionKey] floatValue]; if (avFoundationVersion < 292.24f) { @try { NSSsortingng *contentLayerKeyPath = [NSSsortingng ssortingngWithFormat:@"%1$@%2$@.%3$@%2$@", @"player", [@"layer" capitalizedSsortingng], @"content"]; // playerLayer.contentLayer CALayer *contentLayer = [self.playerLayer valueForKeyPath:contentLayerKeyPath]; if ([contentLayer isKindOfClass:[CALayer class]]) [contentLayer addAnimation:[CABasicAnimation animation] forKey:@"sublayerTransform"]; } @catch (NSException *exception) { } self.bounds = self.bounds; } } @end 

C'était un bug dans iOS 5.0 et iOS 5.0.1.

Après la mise à jour vers iOS 5.1, l'animation de modification de la gravité video a recommencé à fonctionner.