[英]Animate AVPlayerLayer videoGravity property
我正在嘗試復制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的內容屬性以及可能的contentsGravity有某種關系。
正如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
這是iOS 5.0和iOS 5.0.1中的一個錯誤。
更新到iOS 5.1后,視頻重力變化動畫再次開始工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.