AVPlayerLayeranimation帧更改

每当我改变我的AVPlayerLayer帧,video不会立即resize,但animation到新的大小。

例如:我将帧从(0,0,100,100)更改为(0,0,400,400),视图的帧将立即更改,但video的大小将dynamic调整为新的大小。

有没有人遇到过这个问题? 如果是的话,有人知道一种方法来禁用默认animation?

谢谢!

您可以尝试禁用隐式操作并使用零长度animation:

CALayer *videolayer = <# AVPlayerLayer #> [CATransaction begin]; [CATransaction setAnimationDuration:0]; [CATransaction setDisableActions:YES]; CGRect rect = videolayer.bounds; rect.size.width /= 3; rect.size.height /= 3; videolayer.bounds = rect; [CATransaction commit]; 

这是我用过的:

 AVPlayerLayer * playerLayer = <# AVPlayerLayer #>; playerLayer.frame = <# CGRect #>; [playerLayer removeAllAnimations]; 

我希望这有帮助。 我不知道它的最佳做法,但它对我有用。 似乎只要使用“.frame”或“setFrame”,它就会将animation添加到图层。

处理这个问题的最简单最简单的方法是创build一个具有AVPlayerLayer作为其layerClass的UIView子类。 当这样做时,AVPlayerLayer的行为就像普通的UIView层一样。 您可以更改视图的框架而不是图层,并且不会发生隐式animation。

AVPlayerLayerView.h

 #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface AVPlayerLayerView : UIView @property (nonatomic, readonly) AVPlayerLayer *playerLayer; @end 

AVPlayerLayerView.m

 #import "AVPlayerLayerView.h" @implementation AVPlayerLayerView + (Class)layerClass { return [AVPlayerLayer class]; } - (AVPlayerLayer *)playerLayer { return (AVPlayerLayer *)self.layer; } @end 

你现在可以这样做:

 playerLayerView.frame = CGRectMake(0, 0, 400, 400); 

要将AVPlayerLayer与AVPlayer相关联,只需执行以下操作:

 playerLayerView.playerLayer.player = player; 

你用?:

 - (void)setPlayer:(AVPlayer *)player { [(AVPlayerLayer *)[self layer] setPlayer:player]; [(AVPlayerLayer *)[self layer] setVideoGravity:AVLayerVideoGravityResize]; } 

这是我在改变playerLayerframe之后在Swift中做的事情:

 playerLayer.removeAllAnimations() 

可能是这样,在某些情况下会有所帮助:

在视图中添加自定义的“setFrame:”setter来保存播放器图层

 - (void)setFrame:(CGRect)frame { [super setFrame:frame]; self.playerLayer.frame = CGRectMake(0.0f, 0.0f, frame.size.width, frame.size.height); }