2017-02-01 3 views
0

Ich mache gerade einige Tests, um zu sehen, ob meine App auf Retina Macs korrekt läuft. Ich habe Quartz Debug für diesen Zweck installiert und ich führe gerade einen skalierten Modus. Mein Bildschirmmodus ist jetzt 960x540, aber natürlich ist die physische Größe des Monitors immer noch Full HD, d. H. 1920x1080 Pixel.Gibt es eine Möglichkeit, den Skalierungskoeffizienten für ein CGDisplay zu finden?

Bei der Abfrage der Monitor-Datenbank mit und dann CGDisplayBounds() auf den einzelnen Monitoren in der Liste ist die zurückgegebene Monitorgröße 960x540. Dies ist, was ich erwartet habe, weil CGDisplayBounds() heißt, den globalen Anzeigekoordinatenraum zu verwenden, nicht Pixel.

Zu meiner Überraschung, jedoch, CGDisplayPixelsWide() und CGDisplayPixelsHigh() auch 960x540 zurück, obwohl sie ausdrücklich Pixel zurückgegeben werden, so würde ich erwarten, dass sie stattdessen 1920x1080 zurückgeben. Aber sie nicht.

Das lässt mich fragen, wie kann ich die reale physische Auflösung des Monitors anstelle des skalierten Modus mit den CGDisplay APIs, d. H. 1920x1080 statt 960x540 in meinem Fall abrufen? Gibt es eine Möglichkeit, den Skalierungskoeffizienten für eine CGDisplay zu erhalten, so dass ich die reale physikalische Auflösung selbst berechnen kann?

Ich weiß, dass ich diesen Skalierungskoeffizienten mit der backingScaleFactor Methode bekommen kann, aber das ist nur möglich für NSScreen, wie kann ich den Skalierungskoeffizienten für eine CGDisplay bekommen?

Antwort

1

Sie müssen den Modus des Displays untersuchen, nicht nur das Display selbst. Verwenden Sie CGDisplayCopyDisplayMode() und dann CGDisplayModeGetPixelWidth() und CGDisplayModeGetPixelHeight(). Diese letzten beiden sind relativ neuere Funktionen und die Dokumentation besteht hauptsächlich in den Headern.

Und natürlich, vergessen Sie nicht CGDisplayModeRelease() das Mode-Objekt.

+0

Hier ist ein Follow-up, das zu dieser Frage verwandt wird: http://stackoverflow.com/q/42024942/1197719 – Andreas

Verwandte Themen