Weird UIView trasforma in Retina iPhone

2

Sto avendo un problema che non capisco. Sto sviluppando un'applicazione OpenGL per iOS. Perché in alcuni punti voglio forzare l'orientamento della vista in modo programmatico, e Apple per qualsiasi motivo non lo rende facile (o persino possibile), lo sto facendo a mano.

Ritorna sempre NO in shouldAutoRotateToInterfaceOrientation , e quando voglio cambiare l'orientamento (in verticale, per esempio), faccio qualcosa di simile in UIView:

[self setTransform:CGAffineTransformMake(1, 0, 0, 1, 0, 0)];
[self setBounds:CGRectMake(0, 0, 768, 1024)];

Funziona bene.

Per supportare i dispositivi Retina, ho iniziato a controllare [UIScreen mainScreen].scale e a impostare self.contentScaleFactor di conseguenza. Ho anche modificato il codice sopra per tenere conto delle nuove dimensioni, in questo modo:

[self setTransform:CGAffineTransformMake(1, 0, 0, 1, 0, 0)];
[self setBounds:CGRectMake(0, 0, 2*768, 2*1024)];

Stessa rotazione, dimensioni diverse. Il risultato strano con questo è che ottengo uno "schermo" con le giuste dimensioni, ma ho cancellato metà schermo verso il basso e verso sinistra. Per correggere questo, ho bisogno di fare quanto segue:

[self setTransform:CGAffineTransformMake(1, 0, 0, 1, 0, 0)];
[self setBounds:CGRectMake(-768, -1024, 2*768 - 768, 2*1024 - 1024)];

Funziona, ma è brutto, ho anche bisogno di fare correzioni simili quando ottengo le coordinate touch, e peggio di tutto, non capisco cosa sta succedendo o perché funziona la "correzione" sopra.

Qualcuno può far luce su questo problema?

    
posta ggambett 30.11.2012 - 17:38
fonte

2 risposte

1

Non modificare i valori della dimensione dello schermo!

Se ottieni valori della dimensione dello schermo da [[UIScreen mainScreen] bounds] :

  • Prendi in considerazione l'altezza della barra di stato.
  • Se ritratto: imposta larghezza per schermo altezza e altezza per larghezza schermo

    - Guarda il mio codice per vedere di cosa sto parlando: UIScreen + categoria flessibile .

Se ottieni i valori della dimensione dello schermo dalla vista padre:

  • Assicurati di non impostare nessun frame prima che sia impostato il frame della vista genitore.

Inoltre, utilizza setFrame . Non riesco a pensare a un caso in cui dovresti impostare dei limiti? *

* Potrei sbagliarmi sull'impostazione dei limiti.

    
risposta data 16.08.2013 - 19:19
fonte
1

In OpenGL ES tutte le tue trasformazioni devono essere fatte sul contesto OpenGL ES. E sul tuo livello di vista devi impostare scaleFactor sull'oggetto vista che è tipo GLKView.

view.contentScaleFactor = [UIScreen mainScreen].scale;

E non dimenticare di impostare glViewPort.

glViewport(0,
           0,
           _screenWidth*self.view.contentScaleFactor,
           _screenHeight*self.view.contentScaleFactor);
    
risposta data 24.09.2013 - 12:36
fonte

Leggi altre domande sui tag