2015-05-14 10 views
7

Sto creando un'app di Minesweeper di base per la pratica/divertimento in rapido. Voglio farlo in modo che le dimensioni del tabellone (10 tessere di larghezza) si adattino a qualsiasi schermo iOS.Perché la larghezza del frame della vista è sempre 600 per 600 con l'autolayout

Per fare questo sto impostando la dimensione di ogni piastrella per ottenere il mio view.frame.width tileContainer e/10.

Il mio problema è che la vista tileContainer è impostato su 600, non importa quale. Sul mio Storyboard ho impostato il tileContainer uguale alla larghezza del View Container, da CTR clic su & trascinando alla vista e selezionando la larghezza uguale. Ciò mantiene la larghezza di tileContainer impostata su 600, indipendentemente dal dispositivo su cui sto eseguendo il test. (che è un mio problema, la larghezza dovrebbe cambiare a seconda della larghezza dello schermo non una costante 600)

Qualcuno sa come posso ottenere la larghezza corretta dello schermo indipendentemente dal dispositivo su cui è in uso?

+0

"Sul mio Storyboard ho impostato la tileContainer uguale alla larghezza della vista del contenitore, da CTR click & trascinando alla vista e selezionando uguale larghezza." Sembra il modo giusto di fare già. –

+0

Visivamente funziona perfettamente, imposta correttamente la larghezza della vista in senso visivo, ma la chiamata in codice per fare tileContainer.frame.width restituirà sempre 600. Se sto testando su iPhone 6, iPhone ridimensionabile, iPhone 5s. Restituisce sempre un 600 –

+0

E poiché è a 600, le larghezze delle piastrelle sono impostate su 60, e rapidamente finiscono per andare fuori schermo –

risposta

15

Quando si utilizza il layout automatico, le sottoview vengono disposte dopo la funzione viewDidLayoutSubviews. Pertanto, se si chiama tileContainer.frame.size prima, ad esempio in viewDidLoad, sarà sempre 600 per 600 (che è la dimensione predefinita nello storyboard).

viewDidLayoutSubviews: Chiamato per notificare al controller della vista che il suo punto di vista è appena deposto le sue subviews. reference

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    print(tileContainer.frame.size); // This is actual size you are looking for 
} 
+0

Grazie che ha senso e ha risposto alla mia domanda. Conosci una funzione che verrà chiamata o un modo per attendere l'esecuzione del codice dopo che tutto è stato caricato? Perché viewDidLayoutSubviews() viene chiamato due volte per me. –

+0

Ciao @EvanNudd, sì, questa funzione verrà richiamata più volte. Vedi questo [post] (http://stackoverflow.com/questions/27014360/why-viewdidlayoutsubviews-call-multiple-times) per una spiegazione. Ma penso che sia tutto a posto. Ad esempio, quando si ruota il dispositivo, la larghezza verrà sicuramente cambiata e sarà necessario modificare le tessere di conseguenza. –

+1

Immagino tu stia provando a creare alcune sottoview come tile? In tal caso, ciò che puoi fare è inserire il codice init alloc in viewDidLoad e quindi inserire un po 'di riposizionamento/ridimensionamento del codice in 'viewDidLayoutSubviews'. –

2

Risposta breve:. UIScreen.mainScreen() bounds.size.width sempre restituisce la larghezza dello schermo.

Risposta lunga: sembra che si stia utilizzando il layout automatico con classi di dimensioni. Puoi far funzionare tutto solo usando i vincoli. Puoi impostare una larghezza proporzionale e un vincolo di altezza dalla tua tessera al tuo contenitore in modo che la tessera corrisponda al 10% della larghezza e dell'altezza del contenitore. Quindi, puoi impostare tutte le altre tessere per avere uguale larghezza e altezza per quella tessera. Quindi, utilizza i vincoli per posizionarli in una griglia.

Un'altra strategia che utilizza l'autolayout sarebbe quella di impostare la spaziatura tra le celle da 0 e lasciare la larghezza e l'altezza non vincolate. Se hai 10 celle con 0 spazio tra le celle e tra loro, e 0 spazio tra le celle anteriore e posteriore e il contenitore, allora assumeranno automaticamente l'1/10 della larghezza del contenitore.

Nota aggiuntiva, se si utilizzano classi di dimensione/layout automatico, le dimensioni della vista non sono impostate correttamente fino a quando le sottoview non sono disposte, quindi se si sta tentando di eseguire questa larghezza in viewDidLoad, ad esempio, la larghezza sarebbe comunque la larghezza della classe Any Any size (600).

3

Mentre le risposte accettate sono una risposta corretta, ho pensato che potrei almeno dire che è possibile forzare la vista a disegnarsi prima di colpire viewDidAppear:.

entrambi i casi, è possibile nel vostro viewDidLoad: chiamata:

view.setNeedsLayout()
view.layoutIfNeeded()

O se lo si crea da "fuori":

let vc = UIViewController()
let _ = vc.view

o

let vc = UIViewController()
vc.view.setNeedsLayout()
vc.view.layoutIfNeeded()

+0

Aggiungi 'view.setNeedsLayout()' e 'view.layoutIfNeeded()' in 'viewDidLoad' funziona per me. – yuchen

+0

Aggiungendo solo 'view.layoutIfNeeded()' ha funzionato anche per me, grazie. – erickva

Problemi correlati