OSX Swift - App soll immer auf einem bestimmten Monitor an der gleichen Position auf dem Desktop - beim Start - angezeigt werden.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • OSX Swift - App soll immer auf einem bestimmten Monitor an der gleichen Position auf dem Desktop - beim Start - angezeigt werden.

    Hallo,

    es ist möglich in Xcode (Swift) eine App auf einem bestimmten Monitor an genau der gleichen Position und immer im Vordergrund beim Start anzeigen zu lassen? Welche Attribute müssen hierfür wo in Xcode aktivieren werden?

    Die Berücksichtigung der vorgenommenen Positionierung des Windows funktioniert bei mir anscheinend nur rudimentär. Ich bin bisher nicht dahinter gekommen warum dies der Fall ist.

    Vielleicht hat jemand eine Idee was ich hier außer Acht lasse.

    Nachtrag:
    Ich habe ein neues Projekt angelegt und die Attribute für das Window entsprechend gesetzt und siehe da es funktioniert. Daraufhin habe ich mal die Konfig-dateien der Projekte miteinander verglichen. Signifikante Änderungen die Rückschlüsse auf das Fehlverhalten liefern könnten habe ich nicht gefunden. ;(

    Besteht die Möglichkeit - programmtechnisch - den Monitor während des Starts der App festzulegen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Ergänzung

  • Die Position(en) von Fenstern eines Programms merkt sich macOS/Cocoa in den Preferences des Programms.

    Starte mal die App und Positioniere das Fenster wie gewünscht und schließe dieses, bevor Du die App beendest.

    Wenn dies nicht funktioniert, dann lösche mal die Preferences der App unter (User)/Library/Preferences/(BundleID).plist und starte die App neu.

    Da macOS seit ein paar Versionen die Preferences Cached, muss Du den Mac ggf. neu starten. Evtl. gibt es auch einen Terminal Befehlt, um den Cache der App Preferences zu refreshen.
  • Hmmm, das funktioniert genau wie Du es beschrieben hast. :thumbup:

    Gibt es keine Möglichkeit die App programmtechnisch so zu erweitern, dass diese nur auf einem z.B. dem 2.'ten Monitor gestartet wird?

    Die Problematik ist die folgende. Mit der o.g. Technik muss der Anwender immer daran denken, die App zu positionieren bevor er diese schließt um sicherzustellen, dass diese genau an dieser Stelle auch wieder geöffnet wird.

    Normalerweise könnte man davon ausgehen, dass jeder Anwender im Umgang mit OSX vertraut ist. Ich will hier auch keine Diskussion führen wie sinnvoll so eine Anforderung ist bzw. warum diese Anforderung besteht. Mir ist nur wichtig, dass die App bei jedem Start genau an der gleichen Position und auf dem gewünschten Monitor erscheint. Ich hoffe es gibt eine Möglichkeit dies während des Startvorgangs der App festlegen zu können?
  • MCDan schrieb:

    Du kannst natürlich die automatische Speicherung der Fensterposition und Größe deaktivieren und die Position und Größe des Fensters vor dem Anzeigen per Code setzen.

    Dabei kannst Du das Fenster dann natürlich auch über die Position auf dem gewünschten Screen positionieren.

    Die verfügbaren Screens erhältst Du über screens von NSScreen.
    Perfekt. :thumbsup: Werde es gleich ausprobieren.

    Vielen Dank.
  • MCDan schrieb:

    Es sollte reichen, im Interface Builder, bei dem Window den Autosave Name wegzulassen.
    Ich bin irritiert, denn an dieser Stelle wurde kein Name eingetragen.

    Es funktioniert nun, nachdem ich dem Window Controller eine eigene Class zugeordnet habe. In dieser überschreibe ich die windowDidLoad() Funktion. Es werden nur die aktuellen Fensterdaten wie Größe und Position ausgelesen - nicht neu gesetzt.

    Das Resultat ist, dass die App immer auf Display 0 an der gewünschten Position startet. Aber wieso?

    Nachdem ich dem die zugeordnete Class (Window Controller) wieder gelöschte habe bleibt der Effekt erhalten. Warum? ?(
  • Quellcode

    1. class MyWindowController: NSWindowController
    2. {
    3. override func windowDidLoad()
    4. {
    5. print("Window: ", window!)
    6. let sScreens: [NSScreen] = NSScreen.screens
    7. let sSmallDisplay = sScreens[0].frame
    8. let sBigDisplay = sScreens[1].frame
    9. print("alle Displays: ", sScreens)
    10. print("sSmallDisplay: ", sSmallDisplay)
    11. print("sBigDisplay: ", sBigDisplay)
    12. super.windowDidLoad()
    13. }
    14. }
    Alles anzeigen
    Anbei mal der Quellcode meiner Klasse, welche ich dem Window Controller zugeordnet hatte.

    Ich bin im Bilde, dass Zeile 5 unschön ist und ja man sollte dies vermeiden bzw. auf Existenz prüfen. Aber für diesen Test kann ich dies vertreten.

    Vielmehr würde ich gerne verstehen warum dieser Effekt auftritt?
  • OSXDev schrieb:

    MyMattes schrieb:

    Warum nicht die dokumentierte Funktion zum Disablen via "restorable"-Property nutzen...?

    Mattes
    Du warst schneller. :)
    Weil mir dies so nicht bekannt ist. Werde es ebenfalls testen. Danke mal vorab.
    @MyMattes: Funktioniert einwandfrei. Aber nur wenn ich das Attribute zur Funktion in der MyWindowController Klasse auf false setze.

    Wenn ich dies im VC durchführe, dann wird es nicht berücksichtigt. Eine Fehlermeldung erhalte ich nicht, deshalb gehe ich davon aus, dass der Aufruf zu spät erfolgt. Ist allerdings nur eine Vermutung.
  • Erkenntnis:
    Wenn im IB beim Window das Attribute Full Screen genutzt wird (war hier der Fall), dann kommt es je nach Auswahl zu o.g. Effekt.

    Für dieses Attribute wurde nun der Wert auf NONE gesetzt und zur Sicherheit die von MyMattes genannte Funktion auf false. Dies führt dazu, dass die App grundsätzlich auf Display 0 an der zuvor gesetzten Position (kann im IB angegeben oder via Funktion gesetzt werden) angezeigt wird.

    Warum die Anzeige bzw. Position der App bei den Werten Primary Window und Auxilliary Window nicht erwartungsgemäß funktioniert erklärt sich mir nicht. Werde mir dies in einer ruhigen Minute nachmals zu Gemüte führen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OSXDev ()