Nie opisujesz dopasowania do skali; opisujesz dopasowanie aspektu. (Zredagowałem twoje pytanie w tym względzie.) Widok podrzędny staje się tak duży, jak to możliwe, przy jednoczesnym zachowaniu współczynnika kształtu i dopasowaniu całkowicie do jego rodzica.
W każdym razie możesz to zrobić za pomocą automatycznego układu. Możesz to zrobić całkowicie w IB od Xcode 5.1. Zacznijmy od kilku widoków:
Jasnozielony widok ma współczynnik kształtu 4: 1. Ciemnozielony widok ma współczynnik kształtu 1: 4. Zamierzam skonfigurować ograniczenia tak, aby niebieski widok wypełniał górną połowę ekranu, różowy widok wypełniał dolną połowę ekranu, a każdy zielony widok rozwijał się tak bardzo, jak to możliwe, przy jednoczesnym zachowaniu jego proporcji i dopasowania pojemnik.
Najpierw utworzę ograniczenia ze wszystkich czterech stron niebieskiego widoku. Przypinam go do najbliższego sąsiada na każdej krawędzi, w odległości 0. Upewnij się, że marginesy są wyłączone:
Pamiętaj, że nie aktualizuję jeszcze ramki. Łatwiej jest mi zostawić miejsce między widokami podczas konfigurowania ograniczeń i po prostu ręcznie ustawić stałe na 0 (lub cokolwiek).
Następnie przypinam lewą, dolną i prawą krawędź różowego widoku do najbliższego sąsiada. Nie muszę ustawiać ograniczenia górnej krawędzi, ponieważ jego górna krawędź jest już ograniczona do dolnej krawędzi niebieskiego widoku.
Potrzebuję również ograniczenia równości wysokości między widokiem różowym i niebieskim. Spowoduje to, że każde z nich wypełni połowę ekranu:
Jeśli teraz powiem Xcode, aby zaktualizował wszystkie ramki, otrzymuję:
Więc ograniczenia, które do tej pory ustawiłem, są poprawne. Cofam to i zaczynam pracę nad jasnozielonym widokiem.
Dopasowanie aspektu do jasnozielonego widoku wymaga pięciu ograniczeń:
- Ograniczenie proporcji wymaganego priorytetu do jasnozielonego widoku. Możesz utworzyć to ograniczenie w Xib lub Storyboard w Xcode 5.1 lub nowszym.
- Ograniczenie o wymaganym priorytecie ograniczające szerokość jasnozielonego widoku do mniejszej lub równej szerokości jego kontenera.
- Ograniczenie o wysokim priorytecie ustalające szerokość jasnozielonego widoku na równą szerokości jego kontenera.
- Ograniczenie o wymaganym priorytecie, ograniczające wysokość jasnozielonego widoku, aby była mniejsza lub równa wysokości jego kontenera.
- Ograniczenie o wysokim priorytecie ustalające wysokość jasnozielonego widoku na równą wysokości jego kontenera.
Rozważmy dwa ograniczenia szerokości. Samo ograniczenie mniejsze lub równe nie jest wystarczające do określenia szerokości jasnozielonego widoku; wiele szerokości będzie pasować do ograniczenia. Ponieważ występuje niejednoznaczność, autoukład będzie próbował wybrać rozwiązanie, które minimalizuje błąd w innym ograniczeniu (o wysokim priorytecie, ale niewymaganym). Minimalizacja błędu oznacza, że szerokość powinna być jak najbliższa szerokości kontenera, nie naruszając wymaganego ograniczenia mniejszego lub równego.
To samo dzieje się z ograniczeniem wysokości. A ponieważ wymagane jest również ograniczenie współczynnika proporcji, może ono jedynie zmaksymalizować rozmiar widoku podrzędnego wzdłuż jednej osi (chyba że kontener ma taki sam współczynnik kształtu jak widok podrzędny).
Najpierw tworzę ograniczenie proporcji:
Następnie tworzę równe ograniczenia szerokości i wysokości z kontenerem:
Muszę edytować te ograniczenia, aby były mniejsze lub równe:
Następnie muszę utworzyć inny zestaw równych ograniczeń szerokości i wysokości z kontenerem:
I muszę sprawić, by te nowe ograniczenia były mniejsze niż wymagany priorytet:
Na koniec poprosiłeś o wyśrodkowanie widoku podrzędnego w jego kontenerze, więc ustawię te ograniczenia:
Teraz, aby przetestować, wybiorę kontroler widoku i poproszę Xcode o aktualizację wszystkich ramek. Oto co otrzymuję:
Ups! Widok podrzędny został rozszerzony, aby całkowicie wypełnić jego pojemnik. Jeśli go wybiorę, widzę, że faktycznie zachował swój współczynnik kształtu, ale robi wypełnienie aspektu zamiast dopasowania kształtu .
Problem polega na tym, że w przypadku ograniczenia mniejszego lub równego ważne jest, który widok jest na każdym końcu ograniczenia, a Xcode ustawił ograniczenie przeciwnie do moich oczekiwań. Mogłem wybrać każde z dwóch ograniczeń i odwrócić jego pierwszy i drugi element. Zamiast tego po prostu wybiorę widok podrzędny i zmienię ograniczenia, aby były większe niż lub równe:
Xcode aktualizuje układ:
Teraz robię te same rzeczy w ciemnozielonym widoku na dole. Muszę się upewnić, że jego proporcje wynoszą 1: 4 (Xcode zmienił rozmiar w dziwny sposób, ponieważ nie miał ograniczeń). Nie będę więcej pokazywał kroków, ponieważ są one takie same. Oto wynik:
Teraz mogę uruchomić go w symulatorze iPhone'a 4S, który ma inny rozmiar ekranu niż używany IB, i przetestować rotację:
I mogę przetestować w symulatorze iPhone'a 6:
I przesłaniu moje ostateczne storyboard do tego GIST dla Twojej wygody.