2013-06-12 16 views
6

Quindi sto provando a convertire un NSRect in un CGRect. Ho usato NSRectToCGRect() che copia tutto più finemente, ma non tiene conto dell'asse dell'origine y.NSRect vs CGRect: inversione asse Y

Il problema: l'origine CGRect di (0,0) è in alto a sinistra. L'origine NSRect (0,0) è in basso a sinistra.

Quindi una casella NSRect (0,0,100,100) è posizionata nella parte inferiore sinistra dello schermo, mentre una casella CGRect (0,0,100,100) si trova nella parte superiore sinistra dello schermo.

Ho un hack che fissa la y origine attraverso la matematica di base:

fixedOriginY = screenHeight - NSRect.size.height - NSRect.origin.y 

Così l'equivalente di un NSRect (0,0,100,100) è in realtà CGRect (0,800,100,100) (sul mio 900px di altezza MBA). Comunque non mi piace, ho la sensazione che si romperà/avrà problemi con la retina o complicazioni future.

Qualcuno ha una soluzione o un'idea su come convertire correttamente NSRect in CGRect?

+0

Cosa ti fa pensare che CoreGraphics abbia l'origine in alto a sinistra? Riesco a trovare solo un riferimento indiretto immediatamente, ma vedi http://developer.apple.com/library/ios/#documentation/2DDrawings/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html - cerca il testo "Il sistema di coordinate predefinito usato dal framework Core Graphics è basato su LLO. " (LLO = origine in basso a sinistra) – Tommy

+0

La proprietà del frame NSWindow è NSRect, quindi la posiziono su 0,0 (schermata in basso a sinistra). Converto quel frame in CGRect, faccio uno screenshot usando CGDisplayCreateImageForRect (visualizza [0], windowCGRect). Lo screenshot è in alto a sinistra sullo schermo. – user339946

+1

Non considerarlo come una differenza tra 'CGRect' e' NSRect'. Sono entrambe semplici strutture e i loro valori hanno un significato solo relativo a un sistema di coordinate (o quello del codice che ha fornito o consumato il rect). In questo caso la differenza è tra il sistema di coordinate dello schermo di AppKit e il sistema di coordinate dello spazio di visualizzazione CG, come descritto in [questa risposta] (http://stackoverflow.com/a/14228817/1218876). –

risposta

6

Se l'origine di un rettangolo è in alto a sinistra o in basso a sinistra dipende dal sistema di coordinate in cui viene utilizzato il rettangolo. Non dipende dall'utilizzo di CGRect o NSRect.

In genere, AppKit utilizza i sistemi di coordinate in cui l'angolo inferiore sinistro è l'origine. Allo stesso modo, un CGContext creato crea l'origine in basso a sinistra.

D'altra parte, Quartz Event Services e Quartz Display Services mettono l'origine in alto a sinistra. UIKit (su iOS) mette l'origine in alto a sinistra. È possibile eseguire l'override di isFlipped in una sottoclasse NSView (su OS X) per posizionare l'origine in alto a sinistra.

La matematica di base è necessaria e corretta quando si converte un rettangolo da un sistema di coordinate tradizionale (origine in basso a sinistra) a capovolto (origine in alto a sinistra).

+3

I riquadri delle finestre (ad esempio '- [NSWindow frame]') si trovano nello ** spazio di coordinate dello schermo **, la cui origine è l'angolo in basso a sinistra. I servizi di visualizzazione al quarzo usano spazi di coordinate del desktop ** globali o locali **, le cui origini sono gli angoli corrispondenti in alto a sinistra. –

Problemi correlati