Non stai descrivendo la scala per adattarsi; stai descrivendo l'aspetto adatto. (Ho modificato la tua domanda al riguardo.) La sottoview diventa il più ampia possibile mantenendo le proporzioni e adattandosi completamente al suo genitore.
Ad ogni modo, puoi farlo con il layout automatico. Puoi farlo interamente in IB a partire da Xcode 5.1. Cominciamo con alcune visualizzazioni:
La vista verde chiaro ha un rapporto di formato 4: 1. La vista verde scuro ha un rapporto di 1: 4. Ho intenzione di impostare i vincoli in modo che la vista blu riempia la metà superiore dello schermo, la vista rosa riempia la metà inferiore dello schermo e ogni vista verde si espande il più possibile mantenendo le proporzioni e adattandosi al suo contenitore.
Innanzitutto, creerò vincoli su tutti e quattro i lati della vista blu. Lo appunterò al vicino più vicino su ciascun bordo, con una distanza di 0. Mi assicuro di disattivare i margini:
Nota che non aggiorno ancora il frame. Trovo più facile lasciare spazio tra le viste quando si impostano i vincoli e basta impostare manualmente le costanti su 0 (o qualsiasi altra cosa).
Successivamente, fisso i bordi sinistro, inferiore e destro della vista rosa al vicino più vicino. Non ho bisogno di impostare un vincolo del bordo superiore perché il suo bordo superiore è già vincolato al bordo inferiore della vista blu.
Ho anche bisogno di un vincolo di uguale altezza tra le viste rosa e blu. Questo li farà riempire ciascuno metà dello schermo:
Se dico a Xcode di aggiornare tutti i frame ora, ottengo questo:
Quindi i vincoli che ho impostato finora sono corretti. Lo annullo e inizio a lavorare sulla vista verde chiaro.
L'adattamento alla vista verde chiaro richiede cinque vincoli:
- Un vincolo delle proporzioni con priorità richiesta sulla vista verde chiaro. È possibile creare questo vincolo in un xib o storyboard con Xcode 5.1 o successivo.
- Un vincolo di priorità richiesta che limita la larghezza della vista verde chiaro ad essere minore o uguale alla larghezza del suo contenitore.
- Un vincolo ad alta priorità che imposta la larghezza della vista verde chiaro in modo che sia uguale alla larghezza del suo contenitore.
- Un vincolo di priorità richiesta che limita l'altezza della vista verde chiaro in modo che sia inferiore o uguale all'altezza del suo contenitore.
- Un vincolo ad alta priorità che imposta l'altezza della vista verde chiaro in modo che sia uguale all'altezza del suo contenitore.
Consideriamo i due vincoli di larghezza. Il vincolo minore o uguale, da solo, non è sufficiente per determinare la larghezza della vista verde chiaro; molte larghezze si adatteranno al vincolo. Dato che c'è ambiguità, il layout automatico proverà a scegliere una soluzione che minimizzi l'errore nell'altro vincolo (priorità alta ma non obbligatorio). Ridurre al minimo l'errore significa rendere la larghezza il più vicino possibile alla larghezza del contenitore, senza violare il vincolo minore o uguale richiesto.
La stessa cosa accade con il vincolo di altezza. E poiché è richiesto anche il vincolo delle proporzioni, può solo massimizzare le dimensioni della sottoview lungo un asse (a meno che il contenitore non abbia le stesse proporzioni della sottoview).
Quindi prima creo il vincolo delle proporzioni:
Quindi creo uguali vincoli di larghezza e altezza con il contenitore:
Devo modificare questi vincoli in modo che siano vincoli inferiori o uguali:
Quindi devo creare un altro set di vincoli di larghezza e altezza uguali con il contenitore:
E ho bisogno di rendere questi nuovi vincoli meno della priorità richiesta:
Infine, hai chiesto che la sottoview sia centrata nel suo contenitore, quindi imposterò questi vincoli:
Ora, per testare, selezionerò il controller di visualizzazione e chiederò a Xcode di aggiornare tutti i frame. Questo è quello che ottengo:
Oops! La sottoview si è espansa per riempire completamente il suo contenitore. Se lo seleziono, vedo che in effetti ha mantenuto le proporzioni, ma sta eseguendo un riempimento aspetto anziché un adattamento aspetto .
Il problema è che su un vincolo inferiore o uguale a, importa quale sia la vista a ciascuna estremità del vincolo e Xcode ha impostato il vincolo opposto alle mie aspettative. Potrei selezionare ciascuno dei due vincoli e invertire il suo primo e il secondo elemento. Invece, selezionerò semplicemente la vista secondaria e cambierò i vincoli in modo che siano maggiori o uguali:
Xcode aggiorna il layout:
Ora faccio tutte le stesse cose con la vista verde scuro in basso. Devo assicurarmi che le proporzioni siano 1: 4 (Xcode lo ha ridimensionato in modo strano poiché non aveva vincoli). Non mostrerò più i passaggi poiché sono gli stessi. Ecco il risultato:
Ora posso eseguirlo nel simulatore di iPhone 4S, che ha una dimensione dello schermo diversa da quella utilizzata da IB, e testare la rotazione:
E posso provare nel simulatore di iPhone 6:
Ho caricato il mio storyboard finale su questa sintesi per tua comodità.