【问题标题】:Prevent user from interacting with AVPlayerView?防止用户与 AVPlayerView 交互?
【发布时间】:2018-05-19 18:52:50
【问题描述】:

我正在播放一段视频以在我的 UI 中进行装饰。我隐藏了 AV 播放器控件,但用户仍然可以控制视频。例如,他们可以使用滑动手势快进或快退。

这对我来说特别令人惊讶,因为 AVPlayerView 在它上面有一个覆盖视图。

有谁知道如何阻止所有用户与此视频的互动?

【问题讨论】:

  • 你试过playerView.userInteractionEnabled = false吗?
  • 我应该澄清一下;我使用的是 OS X,而不是 iOS。

标签: cocoa avplayer


【解决方案1】:

滑动手势一般是三个手指,据我所知这些对AVPlayerView的播放行为没有影响; 滚动 手势(两根手指)是这里的问题。要取消默认的滚动手势实现,您只需覆盖AVPlayerView 上的scrollWheel: 事件处理程序:

import Cocoa
import AVKit

class PPPlayerView: AVPlayerView {

    var prohibitScrolling = true

    override func scrollWheel(theEvent: NSEvent) {
        if prohibitScrolling { 
             // just swallow the event 
        } else { 
            // request default behaviour
            super.scrollWheel(theEvent) 
        }
    }
}

【讨论】:

  • 我还覆盖了keyDown,以防止用户使用空格键暂停视频。
  • 我只是扩展了我的AVPlayerView。我只有一个视图,不需要特殊的自定义功能,所以不需要为我子类化......
  • @AltairJones 您能否为您的解决方案提供一个示例?
  • 在下面查看我的答案
  • 这似乎并不能阻止触控板两指滑动手势擦洗视频播放器
【解决方案2】:

或者您可以在新文件中使用扩展名,比如在 'AVPlayerViewExtensions.swift' 中这样说:

import Cocoa
import AVKit

extension AVPlayerView {

    override open func scrollWheel(with event: NSEvent) {
        // Disable scrolling that can cause accidental video playback control (seek)
        return
    }

    override open func keyDown(with event: NSEvent) {
        // Disable space key (do not pause video playback)

        let spaceBarKeyCode = UInt16(49)
        if event.keyCode == spaceBarKeyCode {
            return
        }
    }

}

【讨论】:

    【解决方案3】:

    如果您的视图放置在滚动视图(或需要处理鼠标事件的其他视图)中,您可能需要覆盖 hitTest: 来代替

    - (NSView *)hitTest:(NSPoint)aPoint
    {
       if (prohibitScrolling) {
          return nil;
       } else {
          return [super hitTest:aPoint];
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-25
      • 2011-03-20
      • 2016-10-03
      • 2013-12-20
      • 2019-07-19
      • 1970-01-01
      • 2015-03-08
      • 2021-05-08
      相关资源
      最近更新 更多