2015-06-16 8 views
6

Quando si lavora in modo programmatico con le modalità di visualizzazione in OS X (documentation), ho trovato che lo CGDisplayCopyAllDisplayModes lascia fuori l'opzione più a destra che viene presentata in Preferenze di Sistema.CGDisplayCopyAllDisplayModes esce da una modalità valida

Un simple utility che stampa le dimensioni della modalità di visualizzazione corrente e tutte le modalità disponibili con display di dimensioni uscite questa

current size: 1920x1200 
available sizes: 
2880x1800 
1440x900 
2560x1600 
2048x1280 
1024x768 
800x600 
640x480 
1680x1050 
1280x800 

1920x1200 è un'opzione valida enter image description here

Tutte le altre opzioni che Preferenze di Sistema fornisce rappresentato nella lista. Qualcuno ha qualche idea del perché 1920x1200 potrebbe non essere incluso? Ho provato a cambiare ad un altro dei valori predefiniti in prefs di sistema, ma non ha causato 1920x1200 da includere.

Edit (la risposta accettata è molto meglio di questi imbrogli, ma sto lasciando queste informazioni solo nel caso)

Le modalità di visualizzazione "in scala" si possono trovare facendo riferimento a un privato API.

È possibile creare un file di intestazione che rende disponibili i metodi privati: vedere this gist che ho preso in prestito da this project.

Poi si può vedere tutte le modalità, comprese quelle in scala come questo

print("Private modes:\n") 

var numDisplayModes: Int32 = 0 
CGSGetNumberOfDisplayModes(mainDisplayID, &numDisplayModes) 
print("Num modes \(numDisplayModes)") 

for i in 0...(numDisplayModes-1) { 
    var pmode: CGPrivDisplayMode = CGPrivDisplayMode() 
    CGSGetDisplayModeDescriptionOfLength(mainDisplayID, CInt(i), &pmode, CInt(sizeof(CGPrivDisplayMode))) 

    print("\t\(pmode.modeNumber): \(pmode.width)x\(pmode.height) -- \(pmode.density) \n") 
} 

risposta

4

C'è API pubblica che è documentata solo nell'intestazione. CGDisplayCopyAllDisplayModes() accetta un parametro options, che è un dizionario. I documenti (e anche le intestazioni) dicono che non è utilizzato e devi passare NULL, ma puoi passare un dizionario con la chiave kCGDisplayShowDuplicateLowResolutionModes e il valore kCFBooleanTrue.

Il nome dell'opzione non è molto chiaro. Include un sacco di modalità extra.

Inoltre, potrebbe essere necessario utilizzare CGDisplayModeGetPixelWidth() e CGDisplayModeGetPixelHeight() per distinguere tra la dimensione in punti e la dimensione in pixel del backing store. (CGDisplayModeGetWidth() e CGDisplayModeGetHeight() dimensioni del punto di ritorno. Confrontando questi valori, è possibile determinare se la modalità è ridimensionata.)

Problemi correlati