我试图将本地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
组件内
我想要实现的是:
有什么方法可以实现其中之一吗?或者,如果该组件是除QQuickItem
之外的其他组件,那么可以做到这一点,因为我真正需要的只是播放器层,因为我将创建一个自定义播放控制界面?
答案 0 :(得分:0)
QQuickWindow
是UIView
。单独的QML项不是,因此您不能在QML应用程序的“内部”放置另一个UIView
(或其层),除非您将该应用程序构造为具有其他子项{{1}的顶层QQuickWindow
}},然后将视频层夹在这些Qt Quick窗口(QQuickWindow
)之间。
答案 1 :(得分:0)
在Tor的提示下,我设法使其正常工作。
首先,我创建了另一个UIView
,将m_playerLayer
放在其中。
然后将玩家拉到后面:
[playerView.layer addSublayer:m_playerLayer];
[parentView.window addSubview: playerView];
[parentView.window sendSubviewToBack: playerView];
parentView.opaque = NO;
必须指出的是,即使没有parentView.opaque = NO
ApplicationWindow
,即使没有color: "transparent"
,应用程序仍然具有背景。