Nafiz
Nafiz

Reputation: 462

App window on top of all windows including others app windows

I like to have my NSWindow top of everything including other app windows. How this is possible?

This is how my custom NSWindow looks like?

override init(contentRect: NSRect, styleMask style: NSWindow.StyleMask,
              backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool) {

    super.init(contentRect: contentRect, styleMask: NSWindow.StyleMask.borderless,
               backing: NSWindow.BackingStoreType.buffered, defer: false)

    // Manage window appearance and size
    // this window manages video view controller
    self.backgroundColor = NSColor.clear
    self.alphaValue = CGFloat(AppSingleton.shared.getVideoOpacity()) / 100
    self.isOpaque = false

    self.collectionBehavior = .transient
    }

And this how I open the NSWindowController from a button action

func openPlayerWindow(url: URL) {
    let storyboard:NSStoryboard? = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: Bundle.main)
    let playerWindowController = storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "SIPlayerWindowController")) as! PlayerWindowController

    if let playerWindow = playerWindowController.window {
        playerWindowController.showWindow(nil)
        playerWindow.makeKeyAndOrderFront(self)
        NSApp.activate(ignoringOtherApps: true)

        let videoPlayerController = playerWindow.contentViewController as! VideoPlayerViewController
        videoPlayerController.videoFile = url
    }
}

PlayerView.swift

import Cocoa
import AVFoundation

class PlayerView: NSView {

    override func hitTest(_ point: NSPoint) -> NSView? {
        return nil;
    }
}

This PlayerView immediately fill with CorePlayer in this func. VideoViewController.swift

func playVideo(videoFile: URL) {
        corePlayer.view().translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(corePlayer.view())

        NSLayoutConstraint.init(item: corePlayer.view(), attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1, constant: 0).isActive = true
        NSLayoutConstraint.init(item: corePlayer.view(), attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0).isActive = true
        NSLayoutConstraint.init(item: corePlayer.view(), attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 0).isActive = true
        NSLayoutConstraint.init(item: corePlayer.view(), attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0).isActive = true

        corePlayer.playURL(videoFile.absoluteURL)
}

Upvotes: 1

Views: 565

Answers (2)

Nafiz
Nafiz

Reputation: 462

I found the solution self.ignoresMouseEvents = true;

Upvotes: 0

AVerguno
AVerguno

Reputation: 1377

Try to use this

    self.windowController?.showWindow(nil)
    self.makeKeyAndOrderFront(self)
    NSApp.activate(ignoringOtherApps: true)

Upvotes: 2

Related Questions