W jaki sposób Xcode 6 adaptive UIs może być wstecznie kompatybilny z iOS 7 i iOS 6?

Właśnie obejrzałem wideo WWDC #216, " budowanie 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ą XIB i storyboardy, które mają określone ustawienia dla różnych klas wielkości.)

Nie zmyślam tego. Obejrzyj film WWDC.

Jak to jest możliwe? Kolekcje cech i klasy wielkości są zdefiniowane tylko w systemie iOS 8. W jaki sposób zachowanie środowiska uruchomieniowego zależne od konstrukcji interfejsu, które są nowe w systemie iOS 8, może działać w poprzednich wersjach systemu iOS?

Jeśli jest możliwe, byłoby cudownie. Możesz tworzyć aplikacje, które będą działać na iOS 6, 7 i 8, i skorzystać z nowych elastycznych możliwości układu UI, które Apple dodał do Xcode 6. Sam stworzyłem adaptive UI logic w kodzie i jest to sporo pracy.

Author: Duncan C, 2014-06-12

8 answers

Zmiany wprowadzone do interfejsu użytkownika z klasami wielkości w Interface Builder są poprawnie wyświetlane na urządzeniach z systemem iOS 7 i podgląd w Xcode. Na przykład zmieniłem pewne ograniczenia układu automatycznego i rozmiary czcionek dla regularnej wysokości regularnej szerokości, a te zmienione ograniczenia są widoczne w symulatorze iPada z systemem ios 7.0.

Wszystkie optymalizacje klas wielkości są dostępne dla systemu iOS 7, z wyjątkiem klas wielkości, które mają kompaktową wysokość. Zostało to potwierdzone przez Apple i jest teraz stwierdzone bezpośrednio w Dokumentacja :

W przypadku aplikacji obsługujących wersje systemu iOS wcześniejsze niż iOS 8 większość klas wielkości jest kompatybilna wstecz.

Klasy wielkości są kompatybilne wstecz, gdy:
- Aplikacja jest zbudowana przy użyciu Xcode w wersji 6 lub nowszej
- Cel wdrożenia aplikacji jest wcześniejszy niż iOS 8
- Klasy wielkości są określone w storyboardzie lub xib
- Wartość elementu wysokość nie jest zwarta

Ponieważ iOS 7 nie respektuje kilku klas wielkości, jeśli jeśli ich użyjesz, napotkasz problemy. Na przykład: Gdy masz Kompaktowy w dowolny H zdefiniowany, a następnie Kompaktowy w Kompaktowy H zdefiniowany, na iOS 7 będzie szanował Kompaktowy w dowolny h, ale na iOS 8 renderuje Kompaktowy w kompaktowy wygląd.

Tak więc, jeśli chcesz wykorzystać te dwie klasy wielkości i zachować kompatybilność z iOS 7, wykonałbym wszelkie optymalizacje, których pragniesz dla iPhone ' a w krajobrazie w dowolnym w dowolnym h lub kompaktowym w dowolnym h, a następnie wykonaj inne optymalizacje dla różnych rozmiarów klasy w razie potrzeby, a w ten sposób nie będziesz musiał używać żadnej klasy wielkości o kompaktowej wysokości i unikniesz problemów.

 151
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-20 00:03:19

Podczas wdrażania aplikacji na iOS 7, Xcode skompiluje Twój storyboard na dwa różne sposoby:

  • W przypadku iPhone ' a Twój storyboard zostanie skompilowany jako "Compact-Regular" (Kompaktowa szerokość, regularna wysokość), a to zostanie zapakowane jako stalówka "~iphone".

  • W przypadku iPada Twój storyboard zostanie skompilowany jako "Regular-Regular" i zostanie zapakowany jako stalówka "~ ipad".

Więc jeśli chcesz wdrożyć zarówno na iOS 7, jak i iOS 8, powinieneś skupić swój projekt na Kompaktowe-Dowolne i regularne-dowolne klasy wielkości. Zapewni to najlepsze wrażenia pod względem dopasowania interfejsu użytkownika do celów wdrażania. Oczywiście możesz zmodyfikować układ dla innych klas wielkości, ale jeśli te modyfikacje nie zostaną zastosowane do klas rozmiaru Compact-Regular lub Regular-Regular, nie zobaczysz tych modyfikacji na iOS 7.

 68
Author: Dave DeLong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 19:24:14

Uwaga: Ta odpowiedź była istotna dla wersji beta Xcode 6 i nie ma już zastosowania do wersji wysyłkowej. Zobacz odpowiedzi Joey i Dave DeLong na tej stronie, aby uzyskać odpowiednie informacje.

(oryginalna odpowiedź zachowana poniżej):


Podczas gdy Storyboards/XIBs skonfigurowane do używania klas rozmiaru będą działać na iOS 7, SYSTEM OPERACYJNY obecnie nie respektuje tych size classes i wydaje się używać domyślnej klasy rozmiaru 'Any/Any'.

Zgadzam się, że konkretny slajd, o którym mówisz, wydaje się obiecywać taką zgodność, ale obecnie tak nie jest (Xcode 6 beta 2).

Aby przetestować, stworzyłem projekt (iOS 8 SDK, deployment target of 7.1) z jednym przyciskiem, który jest wyśrodkowany vertically and horizontally w klasie Any/Any size, ale wyrównany do lewego górnego rogu w klasie Compact/Compact size (np. iPhone w krajobrazie). Asystent podglądu Xcode pokazuje, że przycisk zmienia swoją pozycję w iOS 8, ale nie iOS 7. Potwierdziłem to zachowanie na urządzeniu iOS 7.

 27
Author: remmah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:29:56

Ponieważ niektóre z odpowiedzi i komentarzy omawiały naturę wstecznej kompatybilności, pomyślałem, że podzielę się fragmentem bezpośrednio z Dokumentacja Apple:

~~~~~

[9]} wdrażanie aplikacji z klasami wielkości na wcześniejszych wersjach systemu iOS [10]}

W przypadku aplikacji obsługujących wersje systemu iOS wcześniejsze niż iOS 8 większość klas wielkości jest kompatybilna wstecz.

Klasy wielkości są kompatybilne wstecz, gdy:

  • aplikacja jest zbudowana przy użyciu Xcode wersja 6 lub nowsza
  • Aplikacja jest dostępna tylko w języku angielskim.]}
  • klasy wielkości są określone w storyboardzie lub xib
  • wartość elementu wysokości nie jest zwarta

~~~~~

Ten ostatni punkt jest skierowany do tej dyskusji, gdzie Apple potwierdza, że tak długo, jak "kompaktowa wysokość" jest , a nie używane, powinno zachować kompatybilność wsteczną.

Mam nadzieję, że to komuś pomoże!

 12
Author: radiovisual,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-23 12:57:24

Podczas zajmowania się podobnym problemem znalazłem inną odpowiedź, której jeszcze nie widziałem. Wygląda na to, że klasy wielkości w plikach XIB w ogóle nie działają. Jeśli utworzę prototyp komórki w pliku storyboard, działa to w iOS7 tak jak wyjaśniono w innych odpowiedziach, jednak gdy ta sama prototypowa komórka zostanie przeniesiona do oddzielnego pliku XIB - klasy wielkości są ignorowane w iOS7.

Oto link do przykładowego projektu demonstrującego to zachowanie: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

W komórce prototypu mam cztery ograniczenia z każdej krawędzi szarego widoku. Każdy z nich jest skonfigurowany w ten sam sposób: Any/Any - 10, Regular / Regular - 20

Tutaj wpisz opis obrazka

Działa dobrze w symulatorze IOS8 zarówno dla XIB, jak i Storyboard, a w iOS7 tylko komórki zdefiniowane w Storyboard otrzymują zaktualizowane ograniczenia na iPadzie: {]}

Tutaj wpisz opis obrazka

 3
Author: sha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-24 16:23:32

Jeśli to oszczędza komuś czas, ja wierzę że sposób Xcode 6 zapewnia quasi-wsteczną kompatybilność dla klas wielkości jest za pomocą historycznych ~ipad i ~iphone przyrostków storyboardów, i nic więcej. Ma to sens, ponieważ klasy wielkości są bardziej abstrakcyjnym sposobem, w jaki wcześniej zdefiniowaliśmy storyboard na iPada i storyboard na iPhone ' a.

Dlatego:

  • Jeśli twoim celem jest użycie klas wielkości do obsługi układów określonych dla rodziny urządzeń( iPad vs. iPhone), jesteś w luck: klasy wielkości są ładniejszym interfejsem do wcześniej obsługiwanej metody.

  • Jeśli twoim celem jest użycie klas wielkości do obsługi zmienionych układów dla różnych modeli w obrębie tej samej rodziny urządzeń - ie. iPhone 5/6/6 + inc. krajobraz, to masz pecha . Korzystanie z nich wymagałoby minimalnego celu wdrożenia systemu iOS 8.

 2
Author: Jonathan Crooke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-04 17:24:20

@lducool-w interface builder, w Identity inspector, Zmień 'Builds For' na iOS7.1 i Później.

 1
Author: Ash R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-23 10:20:30

Niestety odpowiedzi od Dave 'a i Joey' a nie działają dla mnie. Nie mogę komentować w tym wątku, więc proszę mi wybaczyć, jeśli to złe miejsce.

Wymyśliłem konkretne pytanie na to: Przykład dla iPhone ' a portrait landscape adaptive UI, który jest wstecznie kompatybilny z iOS 7

Z tego, czego się do tej pory nauczyłem, wierzę, że teraz, jak w moim przykładzie, nie jest możliwe, aby mieć 2 oddzielne, różne ograniczenia dla jednego elementu ui w portrait i tryb krajobrazowy z iPhone iOS7 w oparciu o klasy wielkości. Byłbym zadowolony, gdybym się mylił.

 1
Author: Tom Major,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:54