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]; }
这是我在改变playerLayer
的frame
之后在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); }