ios - 进入背景时在视频顶部 mask View

标签 ios swift swift2

编辑:它不是标记链接的副本。如果您仔细观察,问题就不一样了。

如何在视频进入背景时在视频顶部显示 mask View ?我正在开发一个受密码保护的内容应用程序,该应用程序在进入后台时需要一个 mask 屏幕来隐藏内容(这样双击主页按钮就不会显示内容或视频)。如果没有视频播放但在任何视频(例如 YouTube)上失败,我的蒙版 View 逻辑工作正常,视频快照清晰可见。

Need to mask the video from background

post一般谈论问题,但不是在播放视频时。有了视频,问题依然存在。我到目前为止的代码。

//AppDelegate.swift

var maskView: UIView!

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {        
    maskView.backgroundColor = UIColor.redColor()
    return true
}
func applicationDidEnterBackground(application: UIApplication) {
    window?.addSubview(maskView)
}

func applicationWillEnterForeground(application: UIApplication) {
    maskView.removeFromSuperview()
}

最佳答案

你的问题是你使用了错误的方法。 applicationDidEnterBackground 当您按下主页按钮两次时未被调用。我建议您不要使用此方法,而是使用 applicationWillResignActive,即使用户打开 NotificationCenter 也会调用该方法。我用下面的代码测试你的案例。

// appDelegate:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  maskView = UIView(frame: UIScreen.mainScreen().bounds)
  maskView.backgroundColor = UIColor.redColor()
  return true
}

func applicationWillResignActive(application: UIApplication) {
  window?.addSubview(maskView)
}

func applicationWillEnterForeground(application: UIApplication) {
  maskView.removeFromSuperview()
}

// PlayerViewController
@IBOutlet weak var videoView: PlayerView! // root view of current controller
let player = AVPlayer(URL: NSURL(string: "http://www.ebookfrenzy.com/ios_book/movie/movie.mov")!)

override func viewDidLoad() {
  videoView.setPlayer(player)
}

override func viewDidAppear(animated: Bool) {
  player.play()
}

// PlayerView
override class func layerClass() -> AnyClass {
  return AVPlayerLayer.classForCoder()
}

func setPlayer(player: AVPlayer) {
  (layer as! AVPlayerLayer).player = player
}

UPD:我的猜测没有成功,因为你没有给我更多的信息。但现在我明白了:问题是当您播放嵌入式视频时,它会创建与您重叠的新 window。在这个 window 中,您有播放器和一堆不同的 View (您可以使用 chisel 工具的 pviews 命令查看此信息)。为了解决这种情况,我使用下面的代码。 (应用委托(delegate))

var maskViews: [UIView] = []

func maskView() -> UIView {
    let view = UIView(frame: UIScreen.mainScreen().bounds)
    view.backgroundColor = UIColor.redColor()
    return view
}

func applicationWillResignActive(application: UIApplication) {
    for window in UIApplication.sharedApplication().windows {
        let mask = maskView()
        maskViews.append(mask)
        window.addSubview(mask)
    }
}

func applicationDidBecomeActive(application: UIApplication) {
    for view in maskViews {
        view.removeFromSuperview()
    }
    maskViews.removeAll()
}

关于ios - 进入背景时在视频顶部 mask View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33808797/

相关文章:

ios appid '' 不支持修改 'Maps'功能

iphone - NSDate 查找离今天最近的日期

ios - 将 Swift 3.0 的选择器转换为 2.2

swift - 空合并运算符的简写和可重新生成属性的赋值?

ios - 如何在同一注释 View (swift3)下更改mapkit中的引脚颜色

ios - 在 iOS 中具有不同 App ID 前缀的应用程序之间共享数据

某个字符的Swift 4字符串范围

objective-c - 在 objective-c 中声明 swift 协议(protocol)委托(delegate)变量时出错

macos - 使用 xcode 6 将 map 添加到 osx 应用程序

ios - Firebase 通知不适用于 iOS 11.1