A partire da iOS7, i controller di visualizzazione utilizzano il layout a schermo intero per impostazione predefinita. Allo stesso tempo, hai un maggiore controllo sul modo in cui espone le sue viste, e questo è fatto con quelle proprietà:
edgesForExtendedLayout
Fondamentalmente, con questa proprietà si imposta quali lati della vista possono essere estesi per coprire l'intero schermo. Immagina di spingere a UIViewController
in a UINavigationController
. Quando la vista di quel controller di vista è disposta, inizierà dove finisce la barra di navigazione, ma questa proprietà imposterà quali lati della vista (in alto, a sinistra, in basso, a destra) possono essere estesi per riempire l'intero schermo.
Vediamolo con un esempio:
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
Qui non stai impostando il valore di edgesForExtendedLayout
, quindi viene preso il valore predefinito ( UIRectEdgeAll
), quindi la vista estende il suo layout per riempire l'intero schermo.
Questo è il risultato:
Come puoi vedere, lo sfondo rosso si estende dietro la barra di navigazione e la barra di stato.
Ora imposterai quel valore su UIRectEdgeNone
, quindi stai dicendo al controller di visualizzazione di non estendere la vista per coprire lo schermo:
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
E il risultato:
automaticallyAdjustsScrollViewInsets
Questa proprietà viene utilizzata quando la vista è UIScrollView
simile o simile, ad esempio a UITableView
. Volete che la vostra tabella inizi dove finisce la barra di navigazione, perché non vedrete l'intero contenuto in caso contrario, ma allo stesso tempo volete che la vostra tabella copra l'intero schermo durante lo scorrimento. In tal caso, l'impostazione edgesForExtendedLayout
su Nessuno non funzionerà perché la tabella inizierà a scorrere dove finisce la barra di navigazione e non andrà dietro di essa.
Qui è dove questa proprietà è utile, se si lascia che il controller di visualizzazione regoli automaticamente gli inserti (impostando questa proprietà su SÌ, anche il valore predefinito), verranno aggiunti gli inserti nella parte superiore della tabella, quindi la tabella inizierà dove la navigazione la barra termina, ma lo scorrimento coprirà l'intero schermo.
Questo è quando è impostato su NO:
E SÌ (per impostazione predefinita):
In entrambi i casi, la tabella scorre dietro la barra di navigazione, ma nel secondo caso (SÌ), inizierà da sotto la barra di navigazione.
extendedLayoutIncludesOpaqueBars
Questo valore è solo un'aggiunta ai precedenti. Per impostazione predefinita, questo parametro è impostato su NO. Se la barra di stato è opaca, le viste non verranno estese per includere la barra di stato, anche se si estende la vista per coprirla ( edgesForExtendedLayout
a UIRectEdgeAll
).
Se si imposta il valore su SÌ, ciò consentirà alla vista di tornare di nuovo sotto la barra di stato.
Se qualcosa non è chiaro, scrivi un commento e risponderò.
Come fa iOS a sapere cosa usare UIScrollView?
iOS prende la prima sottoview nella vista di ViewController, quella nell'indice 0, e se si tratta di una sottoclasse di UIScrollView
allora applica le proprietà spiegate.
Ovviamente, ciò significa che UITableViewController
funziona per impostazione predefinita (poiché UITableView
è la prima vista).