2013-04-25 106 views
1

我正在嘗試設置NSView,它將覆蓋AVFoundation播放的視頻頂部。我真的只是想創造一些類似於本地QuickTime播放器的東西。我正在嘗試在OS X應用程序上執行此操作。OS X:爲AVFoundation視頻設置播放控制覆蓋圖

我設置了一個NSView,它有兩個子視圖:播放視頻的視圖和包含控件的視圖。無論何時我開始播放視頻時,控件視圖會被推到視頻播放視圖的後面,導致控件視圖無用。

我認爲這個問題與覆蓋視圖層次結構中相同級別的兩個子視圖有關。此問題將導致解決方案使控件查看視頻播放視圖的子視圖。問題在於,要使用AVFoundation播放視頻,視頻播放視圖必須成爲圖層託管視圖,這樣可以防止其擁有子視圖。

事情我已經嘗試解決問題:

  • 使用addSubview:positioned:relativeTo:重新排序的意見。
  • 使超級視圖和控件視圖層支持。

我可能會錯誤地使用這些解決方案,所以如果您認爲他們應該讓我知道。

這是我如何設置我的視頻播放視圖。

self.playerItem = [AVPlayerItem playerItemWithAsset:self.asset]; 
[self.playerItem addObserver:self forKeyPath:@"status" 
      options:0 context:&ItemStatusContext]; 
self.player = [AVPlayer playerWithPlayerItem:self.playerItem]; 

self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player]; 

[self.playerView setLayer:self.playerLayer]; 
[self.playerView setWantsLayer:YES]; 

這似乎是人們想要做的視頻播放的常見事情,所以如果有人知道解決方案,請讓我知道。謝謝!

+0

請分享您解決此問題的經驗。 – Ali 2015-05-22 10:08:17

回答

2

請注意,文檔並沒有說圖層託管視圖不能包含任何子視圖,他們只是說您不能將任何子視圖添加到圖層託管視圖。您可以先將所需的所有子視圖添加到視圖,然後將其轉換爲圖層託管視圖。但是,即使在這種情況下,圖層和子視圖的排序也不是確定性的。

我在我的主視圖中創建了兩個子視圖,解決了這個問題。其中一個子視圖是分層託管的,並具有視頻播放層;另一個子視圖是包含控件的圖層後臺視圖。下面是我如何解決這個問題:

[self setWantsLayer:YES]; // Turn your main view into a layer backed view, so ordering of subviews is deterministic. 

    _controlsView = [[NSView alloc]initWithFrame:frame];   
    _playButtonOverlay = [[NSImageView alloc] initWithFrame:frame]; 
    [ _playButtonOverlay setImage:[NSImage imageNamed:@"play_overlay"]]; 
    [_controlsView addSubview:_playOverlay]; 

    _videoView = [[NSView alloc]initWithFrame:frame]; 
    _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];   
    [_videoView setLayer:_playerLayer]; // make this subview layer-hosted 
    [_videoView setWantsLayer:YES]; 
    [self insertSubview:_videoView belowSubview:_controlsView]; 

如果您還沒有,請參閱NSView中setWantsLayer的文檔。它說:

「層支持的視圖是一個由Core Animation層支持的視圖,任何由該視圖完成的圖形都被緩存在後臺層中,通過調用setWantsLayer:with來配置一個支持層的視圖。值爲YES。

「圖層託管視圖是包含您打算直接操作的Core Animation圖層的視圖。通過實例化Core Animation圖層類並將該圖層提供給視圖的setLayer:方法來創建圖層託管視圖。完成之後,您將調用setWantsLayer:值爲YES。此方法順序至關重要。「