animationAVPlayerLayer videoGravity属性

我试图在video播放中复制苹果的行为,允许用户伸展video图像来填充边界。

@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; NSString *fromValue; NSString *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]; } } } 

这工作得很好,当我尝试和animation的数字属性,如不透明度。 但是,您会从类引用中注意到,AVPlayerLayer的videoGravity属性是一个NSString。 类参考指出它是可以animation的。

所以我的问题是:How!

我相信这可能与CALayer的内容属性和可能的​​contentGravity有关。

正如voromax指出的,这是iOS 5.0中的一个bug。 我反向工程-[AVPlayerLayer setVideoGravity:]在iOS 5.1中的-[AVPlayerLayer setVideoGravity:]实现,以了解animation应该如何工作。 这里是如何解决错误,并在iOS 5.0上有一个不错的animation。

 @implementation VideoPlayerView + (Class) layerClass { return [AVPlayerLayer class]; } - (AVPlayerLayer *) playerLayer { return (AVPlayerLayer *)[self layer]; } - (NSString *) videoGravity { return self.playerLayer.videoGravity; } - (void) setVideoGravity:(NSString *)videoGravity { self.playerLayer.videoGravity = videoGravity; // Workaround a bug in iOS 5.0 float avFoundationVersion = [[[NSBundle bundleForClass:[AVPlayerLayer class]] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey] floatValue]; if (avFoundationVersion < 292.24f) { @try { NSString *contentLayerKeyPath = [NSString stringWithFormat:@"%1$@%2$@.%3$@%2$@", @"player", [@"layer" capitalizedString], @"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 

这是iOS 5.0和iOS 5.0.1中的一个错误。

更新到iOS 5.1后,video重力变化animation开始重新开始工作。