【发布时间】:2019-06-14 16:14:43
【问题描述】:
我试图将原生 iOS 播放器作为自定义 QML 组件并设法做到这一点,这要感谢 this。但是我遇到了组件的 z 顺序问题。
组件构造函数:
MyVideoView::MyVideoView(QQuickItem *parent /*= 0*/)
: QQuickItem(parent)
, m_view(0)
{
connect(this, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(onWindowChanged(QQuickWindow*)));
connect(this, SIGNAL(visibleChanged()), this, SLOT(onVisibleChanged()));
}
onWindowChanged 实现:
void MyVideoView::onWindowChanged(QQuickWindow* window)
{
if(!m_view) {
}
if (window != 0) {
UIView *parentView = reinterpret_cast<UIView *>(window->winId());
AVPlayer *_player;
AVURLAsset *_asset;
AVPlayerItem *_playerItem;
AVPlayerLayer *m_playerLayer;
_player = [[AVPlayer alloc] init];
NSURL *baseURL = [[NSURL alloc] initWithString: @"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
_asset = [AVURLAsset assetWithURL:baseURL];
_playerItem = [AVPlayerItem playerItemWithAsset: _asset];
[_player replaceCurrentItemWithPlayerItem:_playerItem];
m_playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
m_playerLayer.frame = CGRectMake(this->x(), this->y(), this->width(), this->height());
[parentView.layer addSublayer:m_playerLayer ];
[_player play];
} else {
[m_view removeFromSuperView];
}
}
尽管如此,我可以在我的应用程序中使用 ApplicationWindow 组件,但问题是,即使我设置了该组件,它也始终位于顶部,覆盖整个应用程序:
MyVideoView {
z:-3
width: 300
height: 200
x:20
y:300
}
或者把另一个组件的 z 放到例如300。
我认为这是因为QQuickWindow 或由UIView 引起的。
编辑:MyVideoView 被放置在 Item 组件内
我想要实现的是:
- 可以设置组件的 z 顺序
- 或获取应用程序“背后”的组件(在我的应用程序上创建透明部分以便视频可见,这不是最佳解决方案,但我已经没有选择了)
有没有办法实现其中之一,或者如果组件是 QQuickItem 之外的其他东西,是否可以完成,因为我真正需要的唯一部分是播放器层,因为我将创建自定义播放控制界面?
【问题讨论】:
-
我开始认为这是不可能的。如果我理解正确,
window->winId()应该是实际的应用程序窗口本身,所以我尝试带来第三个 UIView,它将保存应用程序“window->winId()”超级视图和m_playerLayer(我放在另一个 UIView 中)这样我就可以使用bringSubviewToFront和sendSubviewToBack更改它们的显示顺序。但无论我尝试什么,播放器组件始终位于顶部,就像它与整个应用程序完全分离一样。
标签: ios objective-c qt uiview qml