首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为AVPlayerLayer videoGravity属性制作动画

为AVPlayerLayer videoGravity属性制作动画
EN

Stack Overflow用户
提问于 2012-01-19 06:00:20
回答 2查看 4.4K关注 0票数 4

我试图复制Apple在视频回放中的行为,允许用户拉伸视频图像以填充边界。

代码语言:javascript
复制
@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的content属性有关,也可能与contentsGravity有关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-08 06:07:07

正如voromax指出的那样,这是iOS 5.0中的一个错误。为了理解动画是如何工作的,我对iOS 5.1中的-[AVPlayerLayer setVideoGravity:]实现进行了逆向工程。这里是如何解决这个错误,并在iOS 5.0上有一个很好的动画。

代码语言:javascript
复制
@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
票数 6
EN

Stack Overflow用户

发布于 2012-03-09 01:26:11

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

在更新到iOS 5.1之后,视频重力变化动画开始再次工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8918105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档