2015-09-14 10 views
7

Ho installato la versione beta di Xcode 7.1 più recente e sto provando a eseguire il mio progetto su iPad Pro Simulator. Tutto è giusto e tutte le funzionalità funzionano correttamente.Ottimizzazione per il nuovo iPad Pro Simulator

Ma ho un problema con le dimensioni dello schermo ...

Nella schermata principale dell'applicazione che correre il prossimo registro:

NSLog(@"%f", self.view.bounds.size.width); 

Ho 1024 per l'orientamento orizzontale. Ma quando creo una nuova applicazione in Xcode 7.1 ed eseguo lo stesso codice sulla schermata principale ottengo un altro valore: 1366.

Oggi ho intenzione di trovare le differenze tra i file di progetto creati nel vecchio Xcode (6.4) e la più recente beta 7.1 usando Araxis Merge.

Ora come risolvere questo problema per il mio vecchio progetto?

+0

Ci sono novità riguardo questo problema? Sto avendo lo stesso problema. Non importa quello che faccio, ottengo costantemente 1024 * 768 nel simulatore di iPad Pro. –

+0

@GergelyKovacs per ora non ho idea di come farlo funzionare. La prossima settimana tornerò su questo argomento. Descriverò i risultati se troverò un po 'di interessante. –

+0

@AlexanderBalabanov: puoi fornire ulteriori informazioni sul problema che stai riscontrando, in modo che possiamo aiutarti? Sto anche risolvendo il problema con il supporto di iPad Pro e vorrei essere sicuro che tutti noi possiamo supportarlo in modo appropriato. Dove stai eseguendo la tua dichiarazione NSLog per vedere i limiti della vista? Stai usando Auto-Layout? Se puoi fornirci qualche altro contesto di ciò che stai vivendo, speriamo che tutti possiamo lavorare insieme per aiutare a risolvere questo problema. –

risposta

0

Se si codifica il frame di qualsiasi elemento dell'interfaccia utente per alcuni motivi, potrebbe essere necessario cambiarlo per il prossimo iPad pro. Perché, ha una dimensione dello schermo diversa (in punti) del tutto.

Se si utilizza il layout automatico e i frame dinamici (ad esempio self.view.bounds.size.width), dovrebbe funzionare correttamente.

+0

Sto usando il layout automatico e i frame dinamici. Non ho alcun frame hardcoded. È strano ma non funziona bene ... –

+0

Ma cosa non funziona per te? Nella domanda hai menzionato che la tua app funzionava correttamente. –

+0

Tutto funziona bene, ma voglio ottenere il valore self.view.bounds.size.width == 1366 su iPad Pro Simulator. Ho solo 1024. Ma quando sto creando un nuovo progetto in Xcode 7.1, il valore di self.view.size.width == 1366. –

1

TL; DR: Sembra che la gerarchia della vista non è regolato per le dimensioni iPad Pro schermo fino viewWillLayoutSubviews: e viewDidLayoutSubviews: viene richiamato. Quando questo viene invocato dal sistema di layout dipende dalla costruzione della gerarchia della vista.


Nell'aggiornamento della mia app per iPad Pro sto anche osservando un comportamento simile. Pertanto ho dato uno sguardo più approfondito agli eventi del ciclo di vita del controller di visualizzazione per vedere cosa stava accadendo sia nel mio progetto esistente che in un nuovo progetto.

Per un progetto nuovo di zecca, utilizzando un controller di visualizzazione che ha solo una barra di navigazione (posizionata appena sotto la barra di stato) e una vista primaria (che occupa il resto dello spazio, con il layout automatico attivato, in modalità orizzontale alla seguente schermata:

Sample view controller with navigation bar and auto-layout

sto vedendo il seguente output dalla console per il ciclo di vita vista del regolatore:

-[ViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} 
-[ViewController viewDidLoad] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} 

-[ViewController viewWillAppear:] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} 
-[ViewController viewWillAppear:] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} 

-[ViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} 
-[ViewController viewWillLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1024, 704}}; .bounds: {{0, 0}, {1024, 704}} 

-[ViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 
-[ViewController viewDidLayoutSubviews] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}} 

-[ViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 
-[ViewController viewDidAppear:] self.primaryView: .frame: {{0, 64}, {1366, 960}}; .bounds: {{0, 0}, {1366, 960}} 

da quello che posso vedere qui, la vista inizia con un wi dth di 1024 punti ma una volta 'viewDidLayoutSubviews' viene eseguita, la dimensione appropriata è stata determinata (1366 punti).

Nel mio progetto per una schermata che utilizza un controller split-view, posso vedere un comportamento simile:

-[XYZViewController viewDidLoad] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} 

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1024, 44}}; .bounds: {{0, 0}, {1024, 44}} 
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 

-[XYZViewController viewWillAppear:] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 0}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 

-[XYZViewController viewWillLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 
-[XYZViewController viewDidLayoutSubviews] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 

-[XYZViewController viewDidAppear:] self.navigationBar: .frame: {{0, 20}, {1366, 44}}; .bounds: {{0, 0}, {1366, 44}} 

In questo caso, dal momento che la gerarchia vista è diverso, viewWillLayoutSubviews: viene chiamato in precedenza nel visualizzare il ciclo di vita del controller e la dimensione corretta è già stata determinata dal momento in cui viene invocato il numero viewWillAppear:. Ma come puoi vedere, questo dipende molto dalla tua gerarchia di vista - quindi ti consiglio di confermare la gerarchia delle tue viste e quindi di determinare la posizione migliore per aggiungere il tuo codice dipendente dalla risoluzione.

+0

Il nuovo metodo 'viewWillTransitionToSize: withTransitionCoordinator:' ti fornirà anche la geometria del frame corretta –

+1

Grazie per il tuo commento @KoreyHinton! Non ho ancora dato un'occhiata a questo, ma potrebbe essere il caso - tuttavia, dal momento che 'viewWillTransitionToSize: withTransitionCoordinator:' non fa realmente parte del ciclo di vita del controller di visualizzazione standard, implementarlo solo per ottenere la dimensione corretta sembra un po 'inutile . Secondo i documenti di Apple, questo è per "dimensioni e modifiche dei tratti", che non mi aspetto che ci sia alcuno dal momento che sia iPad che iPad Pro sono entrambi regolari/regolari sia per gli orientamenti verticali che orizzontali. –

+0

Downvoter: puoi lasciare un commento con la tua preoccupazione, quindi posso provare ad affrontarlo con la mia risposta? Capisco che mentre non riesco a fornire una spiegazione su come i framework Apple stanno gestendo questo sul back-end, le informazioni che ho postato sono accurate e gli attuali limiti Pro di iPad sono accessibili all'interno del ciclo di vita del controller di visualizzazione, anche se forse non quando aspettati che siano. Per favore fatemi sapere quali informazioni aggiuntive vorreste trovare utili e saremo felici di ricercare/aggiornare secondo necessità. Grazie. –

3

Posso essere lontano da qui, ma stavo avendo un problema simile con il simulatore iPad Pro: continuava a darmi la risoluzione standard di 1024 * 768 punti. Dopo alcuni scavi, mi sono reso conto che stavo usando l'immagine di lancio standard dell'iPad (dal momento che non esiste una versione di iPad Pro nel catalogo delle risorse), che ha limitato il mio schermo a 1024 * 768 punti. Una volta che ho introdotto uno storyboard di lancio, tutto è andato a posto e la mia app è stata lanciata con la dimensione corretta, 1366 * 1024 punti.

+0

Anch'io ho uno storyboard di lancio sia per la mia applicazione che per l'applicazione di test che ho messo insieme per confermare questo comportamento, ma ancora come ho spiegato nella mia risposta Non vedo la dimensione effettiva riflessa fino a più tardi nel ciclo di vita del controller della vista. Quando dici "la mia app è stata lanciata con la dimensione corretta", dove lo stai confermando?Lo storyboard del tuo lancio ha una configurazione specifica? Il mio storyboard di lancio è appena impostato sul valore predefinito: dimensione/orientamento/ecc. L'immagine di avvio viene visualizzata correttamente, ma i VC continuano a non ottenere i limiti appropriati fino a un momento successivo. –

+0

Ho confermato la dimensione corretta semplicemente registrando la dimensione della finestra rect. E no, non uso niente di speciale; Tanto che, in realtà, utilizzo un semplice .xib con dimensioni inferite (non uno storyboard), ma dovrebbe fornire gli stessi risultati. –