全屏:调整其父视图大小时不调整AVPlayerLayer的大小

nic*_*las 15 objective-c avfoundation xamarin.ios avplayer

我正在使用MonoTouch中的AV Foundation开发AVPlayer API的视频播放器(但是Objective-c中的解决方案也可能很好).我正在尝试实现全屏模式.

为了显示视频帧,我有一个UIView(让我们称之为回放视图),我将AVPlayerLayer添加为回放视图层的子视图:

UIView *playbackView = ...
AVPlayerLayer *playerLayer = ...
[playbackView.layer addSublayer:playerLayer];
Run Code Online (Sandbox Code Playgroud)

图层属性设置如下:

playerLayer.needsDisplayOnBoundsChange = YES;
playbackView.layer.needsDisplayOnBoundsChange = YES;
Run Code Online (Sandbox Code Playgroud)

确保在更改播放视图大小时调整它们的大小.最初,回放视图具有坐标(0,0,320,180)(仅显示在UI的顶部).然后,我通过将回放视图框架大小设置为窗口大小来执行全屏动画:

playbackView.frame = playbackView.window.bounds;
Run Code Online (Sandbox Code Playgroud)

它工作正常.播放视图现在正在填充所有窗口(设置背景颜色以查看它).但我的AVPlayerLayer仍然保持在视图的顶部,就像之前在非全屏模式下一样.

为什么AVPlayer图层不会根据播放视图的新大小调整大小?我是否还需要在AVPlayerLayer上制作动画?使用setNeedsLayout,layoutSubviews刷新(它似乎没有改变某些东西......)?删除AVPlayerLayer并重新添加?

Jin*_*Jin 27

不要添加为子图层.只需将playbackView的图层用作AVPlayerLayer,如下所示:

+ (Class)layerClass {
    return [AVPlayerLayer class];
}
- (AVPlayer*)player {
    return [(AVPlayerLayer *)[self layer] player];
}
- (void)setPlayer:(AVPlayer *)player {
    [(AVPlayerLayer *)[self layer] setPlayer:player];
}
Run Code Online (Sandbox Code Playgroud)

请参阅AV Foundation编程指南 - 播放器视图

  • Apple更新了他们的AVPlayer示例,其中一个版本演示了如何使用swift实现此功能:https://developer.apple.com/library/prerelease/ios/samplecode/AVFoundationSimplePlayer-iOS/Listings/Swift_AVFoundationSimplePlayer_iOS_PlayerView_swift.html#//apple_ref/doc/UID/TP40016103-Swift_AVFoundationSimplePlayer_iOS_PlayerView_swift-DontLinkElementID_14 (3认同)

onm*_*133 6

如果您将AVPlayerLayer添加为子图层,则需要更新其框架

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    self.avPlayerLayer.frame = self.movieContainerView.bounds;
}
Run Code Online (Sandbox Code Playgroud)