我正在使用MonoTouch中的AV Foundation开发AVPlayer API的视频播放器(但是Objective-c中的解决方案也可能很好) . 我正在尝试实现全屏模式 .
为了显示视频帧,我有一个UIView(让我们称之为回放视图),我将AVPlayerLayer添加为回放视图层的子视图:
UIView *playbackView = ...
AVPlayerLayer *playerLayer = ...
[playbackView.layer addSublayer:playerLayer];
图层属性设置如下:
playerLayer.needsDisplayOnBoundsChange = YES;
playbackView.layer.needsDisplayOnBoundsChange = YES;
确保在更改播放视图大小时调整它们的大小 . 最初,回放视图具有坐标(0,0,320,180)(仅显示在UI的顶部) . 然后,我通过将回放视图框架大小设置为窗口大小来执行全屏动画:
playbackView.frame = playbackView.window.bounds;
它工作正常 . 播放视图现在正在填充所有窗口(设置背景颜色以查看它) . 但我的AVPlayerLayer仍然保持在视图的顶部,就像之前在非全屏模式下一样 .
为什么AVPlayer图层不会根据播放视图的新大小调整大小?我是否还需要在AVPlayerLayer上制作动画?使用setNeedsLayout,layoutSubviews刷新(它似乎没有改变某些东西......)?删除AVPlayerLayer并重新添加?
3 回答
不要添加为子图层 . 只需将playbackView的图层用作AVPlayerLayer,如下所示:
见AV Foundation Programming Guide - 玩家视图
如果您将AVPlayerLayer添加为子图层,则需要更新其框架
有一种更好的方法来实现这一目标 . 这是
AVPlayerLayer
-backed视图,即试图保持视频宽高比 . 通常只使用AutoLayout .PlayerView.h:
PlayerView.m:
和
Swift
上的相同解决方案: