我正在尝试复制Apple在视频播放中的行为,允许用户拉伸视频图像以填充边界。
@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];
}
}
}
当我尝试为不透明度等数字属性设置动画时,这很好用。但是,你会从类引用中注意到,AVPlayerLayer的videoGravity属性是一个NSString。类引用确实指出它是可动画的。
所以我的问题是:如何!?
我认为这可能与CALayer的内容属性以及可能的contentGravity有关。
答案 0 :(得分:5)
正如voromax所指出的,这是iOS 5.0中的一个错误。我在iOS 5.1中反向设计-[AVPlayerLayer setVideoGravity:]
实现,以了解动画应该如何工作。以下是如何解决这个错误并在iOS 5.0上有一个很好的动画。
@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
答案 1 :(得分:1)
这是iOS 5.0和iOS 5.0.1中的一个错误。
更新到iOS 5.1后,视频重力变化动画再次开始工作。