每当我更改AVPlayerLayer的帧时,视频不会立即调整大小,而是动画为新大小。
例如:我将帧从(0,0,100,100)更改为(0,0,400,400),视图的帧立即更改,但视频的大小设置为新大小。< / p>
有没有人遇到过这个问题?如果有,是否有人知道禁用默认动画的方法?
谢谢!
答案 0 :(得分:22)
您可以尝试禁用隐式操作并使用零长度动画:
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];
答案 1 :(得分:4)
这就是我使用的:
AVPlayerLayer * playerLayer = <# AVPlayerLayer #>;
playerLayer.frame = <# CGRect #>;
[playerLayer removeAllAnimations];
我希望这会有所帮助。我不知道它是否是最佳实践,但它对我有用。 似乎每当使用“.frame”或“setFrame”时,它都会向图层添加动画。
答案 2 :(得分:4)
处理这个问题最简单,最干净的方法是创建一个UIView子类,其中包含AVPlayerLayer作为其layerClass。这样做时,AVPlayerLayer的行为就像常规的UIView层一样。您可以更改视图的框架而不是图层,也不会发生隐式动画。
<强> 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;
答案 3 :(得分:1)
你使用?:
- (void)setPlayer:(AVPlayer *)player {
[(AVPlayerLayer *)[self layer] setPlayer:player];
[(AVPlayerLayer *)[self layer] setVideoGravity:AVLayerVideoGravityResize];
}
答案 4 :(得分:1)
以下是我在更改playerLayer
frame
之后在 Swift 中所做的事情:
playerLayer.removeAllAnimations()
答案 5 :(得分:1)
我通过以下方法在 Swift 4 中进行了这项工作:
var videoLayer = AVPlayerLayer()
CATransaction.begin()
CATransaction.setAnimationDuration(0)
CATransaction.setDisableActions(true)
var rect = videoLayer.bounds
rect.size.width /= 3
rect.size.height /= 3
videoLayer.bounds = rect
CATransaction.commit()
答案 6 :(得分:0)
可能这个,在某些情况下会有所帮助:
添加自定义&#39; setFrame:&#39;视图中的setter保存播放器层
- (void)setFrame:(CGRect)frame {
[super setFrame:frame];
self.playerLayer.frame = CGRectMake(0.0f, 0.0f, frame.size.width, frame.size.height);
}