es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Al cambiar de Espacios, mantenga el NSPanel flotante en su espacio original

Mi aplicación basada en documentos tiene paneles flotantes adjuntos a sus ventanas principales de documentos. Al usar Espacios, al cambiar entre escritorios, los paneles flotantes siguen el cambio. Me gustaría mantenerlos en el espacio original.

El comportamiento es obviamente causado por level siendo NSFloatingWindowLevel, y no NSNormalWindowLevel, incluso si mi collectionBehavior está establecido en 0. Intento evitar esto estableciendo el nivel de la ventana como normal cuando la ventana del documento ya no es principal:

- (void)windowDidResignMain:(NSNotification *)notification {
    for (NSPanel *panel in panels) {
        panel.level = NSNormalWindowLevel;
    }
}

Sin embargo, por alguna razón, cuando el usuario cambia de espacio, el documento no renuncia automáticamente. En ese momento, macOS decide poner todos los paneles en el siguiente Espacio y los deja allí, incluso cuando la ventana del documento original vuelve a ser principal.

He intentado capturar NSWorkspaceActiveSpaceDidChangeNotification, pero esto sucede demasiado tarde y los paneles ya se han movido al espacio incorrecto.

Esto se puede solucionar utilizando [window addChildWindow:...], pero afecta seriamente la interfaz de usuario, ya que todos los paneles se mueven junto con la ventana principal.

¿Hay alguna forma de hacer que las ventanas siempre en primer plano permanezcan en el mismo Espacio en el que estaban antes? ¿O hay una configuración de window.level que mantendría algunas ventanas en la parte superior de su ventana principal, pero no por encima de otras cosas?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Mantener los paneles flotantes de una aplicación de macOS basada en documentos en su espacio original

    Cuando se utilizan Espacios en macOS, al cambiar entre escritorios, los paneles flotantes de una aplicación basada en documentos los siguen. Sin embargo, si se desea mantenerlos en el espacio original y no se desea este comportamiento, el nivel de la ventana debe establecerse como normal cuando la ventana del documento deje de ser la principal. Esto se puede lograr agregando el siguiente código en el delegado de la ventana del documento:

    - (void)windowDidResignMain:(NSNotification *)notification {
        for (NSPanel *panel in panels) {
            panel.level = NSNormalWindowLevel;
        }
    }
    

    Sin embargo, esta solución tiene ciertas limitaciones. Cuando el usuario cambia de espacio, la ventana del documento no deja automáticamente de ser la principal. Como resultado, macOS coloca todos los paneles en el siguiente espacio y los deja allí, incluso cuando la ventana del documento original vuelve a ser la principal.

    Para solucionar este problema, capturar NSWorkspaceActiveSpaceDidChangeNotification es una opción, pero ocurre demasiado tarde y los paneles ya se han movido al espacio incorrecto. Otra solución es utilizar [window addChildWindow:...], pero puede afectar la interfaz de usuario, ya que todos los paneles se mueven junto con la ventana principal.

    Por lo tanto, la pregunta sigue siendo: ¿Existe alguna manera de hacer que las ventanas siempre visibles permanezcan en el mismo espacio en el que estaban antes? ¿O existe una configuración de window.level que mantendría ciertas ventanas sobre su ventana principal pero no sobre otras ventanas?

Comments are closed.