Właśnie obejrzałem wideo WWDC nr 216 „Tworzenie adaptacyjnego interfejsu użytkownika za pomocą UIKit”.
Około 45:10 Tony Ricciardi mówi o zmianach w IB w Xcode 6, aby wspierać nowe zmiany.
Mówi: „Możesz wdrożyć te dokumenty wstecz do starszych wersji iOS”.
(gdzie „te dokumenty” prawdopodobnie oznaczają pliki XIB i scenorysy, które mają określone ustawienia dla różnych klas wielkości).
Nie zmyślam. Idź, obejrzyj wideo WWDC.
Jak to możliwe? Kolekcje cech i klasy rozmiarów są zdefiniowane tylko w iOS 8. W jaki sposób zachowanie środowiska wykonawczego zależne od konstrukcji interfejsu użytkownika, które są nowe w systemie iOS 8, może działać w poprzednich wersjach systemu iOS?
Jeśli jest to możliwe, to byłoby wspaniale. Możesz tworzyć aplikacje, które będą działać na iOS 6, 7 i 8, i korzystać z nowych, elastycznych możliwości układu interfejsu użytkownika, które Apple dodał do Xcode 6. Sam utworzyłem adaptacyjną logikę interfejsu użytkownika w kodzie i to całkiem sporo pracy.
źródło
Odpowiedzi:
Zmiany wprowadzone w interfejsie użytkownika za pomocą klas rozmiaru w programie Interface Builder DO pojawiają się poprawnie na urządzeniach z systemem iOS 7 i na podglądzie w Xcode. Na przykład zmieniłem niektóre ograniczenia Auto Layout i rozmiary czcionek na Normalna wysokość Normalna szerokość, a te zmienione ograniczenia są widoczne w symulatorze iPada z systemem iOS 7.0.
Wszystkie optymalizacje klas rozmiaru są udostępniane w systemie iOS 7, z wyjątkiem klas rozmiarów, które mają niewielką wysokość. Zostało to potwierdzone przez Apple i jest teraz podane bezpośrednio w dokumentacji :
W przypadku aplikacji obsługujących wersje systemu iOS wcześniejsze niż iOS 8 większość klas rozmiaru jest wstecznie zgodna.
Klasy rozmiaru są kompatybilne wstecz, gdy:
- Aplikacja została zbudowana przy użyciu Xcode w wersji 6 lub nowszej
- Cel wdrożenia aplikacji jest wcześniejszy niż iOS 8
- Klasy rozmiaru są określone w scenorysie lub xib
- Wartość składnika wysokości nie jest zwarta
Ponieważ iOS 7 nie respektuje kilku klas rozmiarów, jeśli ich użyjesz, napotkasz problemy. Na przykład: Gdy masz zdefiniowane Kompaktowe w Dowolne h, a następnie Kompaktowe w Kompaktowe h, w iOS 7 będzie uwzględniać Kompaktowe w Dowolne h, ale w iOS 8 renderuje wygląd Kompaktowy w Kompaktowy h.
Tak więc, jeśli chcesz wykorzystać te dwie klasy rozmiarów i zachować zgodność z iOS 7, dokonałbym wszelkich optymalizacji dla iPhone'a w orientacji poziomej w Any w Any h lub Compact w Any h, a następnie przeprowadź inne optymalizacje dla różnych klas rozmiarów w razie potrzeby, dzięki czemu nie będziesz musiał używać żadnej klasy rozmiaru o niewielkiej wysokości i unikniesz problemów.
źródło
Compact-Compact
nie jest eksportowany dla iOS 7;Compact-Regular
jest. Zobacz moją odpowiedź, aby uzyskać więcej informacji.Podczas wdrażania aplikacji na iOS 7 Xcode skompiluje scenorys na dwa różne sposoby:
W przypadku iPhone'a storyboard zostanie skompilowany jako „Compact-Regular” (niewielka szerokość, regularna wysokość), a ten zostanie spakowany jako stalówka „~ iphone”.
W przypadku iPada scenorys jest kompilowany jako „Zwykły-zwykły” i pakowany jako końcówka „~ ipad”.
Jeśli więc chcesz wdrożyć zarówno na iOS 7, jak i iOS 8, powinieneś skupić się na klasach wielkości Compact-Any i Regular-Any. Zapewni to najlepsze wrażenia pod względem dopasowania interfejsu użytkownika do celów wdrożenia. Oczywiście mile widziane jest modyfikowanie układu dla innych klas rozmiarów, ale jeśli te modyfikacje nie zostaną zastosowane do klas rozmiarów Compact-Regular lub Regular-Regular, nie zobaczysz tych modyfikacji w systemie iOS 7.
źródło
Uwaga: ta odpowiedź dotyczyła wersji beta Xcode 6 i nie ma już zastosowania do wersji wysyłkowej. Zobacz odpowiedzi Joey'a i Dave'a DeLonga na tej stronie, aby uzyskać prawidłowe informacje.
(oryginalna odpowiedź zachowana poniżej):
Mimo że system operacyjny jest
Storyboards/XIBs
skonfigurowany do używania klas wielkościiOS 7
, obecnie ich nie przestrzegasize classes
i wydaje się, że używa domyślnej klasy rozmiaru „Dowolna / Dowolna”.Zgadzam się, że konkretny slajd, do którego się odnosisz, wydaje się obiecać taką kompatybilność, ale obecnie wydaje się, że tak nie jest
(Xcode 6 beta 2)
.Aby przetestować, utworzyłem projekt
(iOS 8 SDK, deployment target of 7.1)
z jednym przyciskiem wyśrodkowanymvertically and horizontally
w klasie rozmiaru Dowolny / Dowolny, ale wyrównany do lewego górnego rogu w klasie rozmiaru Compact / Compact (np. IPhone w orientacji poziomej). Asystent podglądu Xcode pokazuje, że przycisk zmienia swoją pozycję naiOS 8
, ale nieiOS 7
. Potwierdziłem to zachowanie również naiOS 7
urządzeniu.źródło
Ponieważ niektóre odpowiedzi i komentarze omawiały naturę kompatybilności wstecznej, pomyślałem, że udostępnię fragment bezpośrednio z Dokumentacji Apple :
~~~~~
Wdrażanie aplikacji z klasami rozmiaru we wcześniejszych wersjach systemu iOS
W przypadku aplikacji obsługujących wersje systemu iOS wcześniejsze niż iOS 8 większość klas rozmiaru jest wstecznie zgodna.
Klasy wielkości są kompatybilne wstecz, gdy:
~~~~~
Ten ostatni punkt dotyczy tej dyskusji, w której Apple potwierdza, że dopóki nie zostanie użyta „kompaktowa wysokość” , powinien zachować kompatybilność wsteczną.
Mam nadzieję, że to komuś pomoże!
źródło
Mając do czynienia z podobnym problemem, znalazłem inną odpowiedź, której jeszcze tu nie widziałem. Wygląda na to, że klasy rozmiaru w
XIB
plikach w ogóle nie działają. Jeśli utworzę prototyp komórki wstoryboard
pliku, będzie działać w iOS7, jak wyjaśniono w innych odpowiedziach, jednak gdy ta sama prototypowa komórka zostanie przeniesiona do oddzielnegoXIB
pliku - klasy rozmiaru są ignorowane w iOS7.Oto łącze do przykładowego projektu demonstrującego takie zachowanie: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip
W komórce prototypowej mam cztery ograniczenia z każdej krawędzi szarego widoku. Każdy z nich jest konfigurowany w ten sam sposób: Dowolny / Dowolny - 10, Zwykły / Zwykły - 20
Działa dobrze w symulatorze iOS8 zarówno dla XIB, jak i Storyboard, aw iOS7 tylko komórki zdefiniowane w Storyboard otrzymują zaktualizowane ograniczenia na iPadzie:
źródło
Jeśli oszczędza to komuś czas, uważam , że sposób, w jaki Xcode 6 zapewnia quasi-wsteczną kompatybilność dla klas rozmiarów, polega na historycznych
~ipad
i~iphone
przyrostkowych scenorysach i nic więcej. Ma to sens, ponieważ klasy wielkości są bardziej abstrakcyjnym sposobem, w jaki wcześniej zdefiniowaliśmy scenorys na iPada i scenorys na iPhone'a.W związku z tym:
Jeśli Twoim celem jest użycie klas rozmiarów do obsługi układów specyficznych dla rodziny urządzeń (iPad kontra iPhone), to masz szczęście: klasy rozmiarów są lepszym interfejsem dla poprzednio obsługiwanej metody.
Jeśli Twoim celem jest użycie klas rozmiarów do obsługi zmienionych układów dla różnych modeli w ramach tej samej rodziny urządzeń - tj. iPhone 5/6/6 + inc. krajobraz, to nie masz szczęścia . Korzystanie z nich wymagałoby co najmniej celu wdrożenia systemu iOS 8.
źródło
@lducool - w kreatorze interfejsów w Inspektorze tożsamości zmień „Builds For” na iOS7.1 lub nowszy.
źródło
Niestety odpowiedzi od Dave'a i Joey'a nie działają dla mnie. Nie wolno mi komentować w tym wątku, więc proszę wybacz mi, jeśli to niewłaściwe miejsce.
W tym celu zadałem konkretne pytanie: Przykład dla iPhone'a z adaptacyjnym interfejsem pionowym i poziomym, który jest wstecznie kompatybilny z iOS 7
Z tego, czego się do tej pory nauczyłem, uważam teraz, że podobnie jak w moim przykładzie nie jest możliwe, aby mieć 2 oddzielne, różne ograniczenia dla jednego elementu interfejsu użytkownika w trybie pionowym i poziomym w przypadku iPhone'a iOS7 na podstawie klas wielkości. Byłbym jednak zadowolony, gdybym się mylił.
źródło