W jaki sposób adaptacyjne interfejsy użytkownika Xcode 6 mogą być wstecznie zgodne z systemami iOS 7 i iOS 6?

137

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.

Duncan C
źródło
2
Istnieje również dokument firmy Apple, który opisuje zgodność z wersjami <8
Alladinian

Odpowiedzi:

151

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.

Jordan H.
źródło
Mogę potwierdzić, że w Beta4 klasa rozmiaru Compact / Compact nie jest przestrzegana w symulatorze ani na urządzeniu z systemem iOS 7. Ciekawe, że niektóre klasy wielkości są jednak przestrzegane. Dzięki za test.
remmah
Testowanie na Regular / Regular na urządzeniu i NIE reaguje na dostosowanie klasy rozmiaru, wszystko, co otrzymuję, to Any / Any z Beta 7
hokiewalrus
@hokiewalrus Właśnie sprawdziłem w Xcode 6 beta 7 i otrzymałem dokładnie te same wyniki, które opisałem w odpowiedzi. Zmiana szerokości pudełka w IB dla Regular Regular wyświetla się poprawnie na iPadzie z systemem iOS 7.1.
Jordan H,
3
@Joey to nie jest błąd; jest to zamierzone. Compact-Compactnie jest eksportowany dla iOS 7; Compact-Regularjest. Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Dave DeLong,
2
Powinna być akceptowana odpowiedź, powyższa odpowiedź jest myląca.
Dominic Lacaille,
68

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.

Dave DeLong
źródło
Rozumiem, że Twoja odpowiedź jest taka, że ​​„Regular-Regular” powinno działać na iPadzie iOS7. Ale to nie działa. Testowałem w wersji XCode6 GM. Proszę, popraw mnie, jeśli źle zinterpretowałem twoją odpowiedź.
Iducool,
4
Wygląda na to, że zwykła, regularna praca tylko nad storyboardem, a nie xib
Boris Charpentier
@BorisCharpentier Zgłosiłem błąd dotyczący tego rdar: // 18737656 , który został zamknięty jako duplikat otwartego # 18490866
Maxim Pavlov
@BorisCharpentier Czy znalazłeś jakieś rozwiązanie dla XIB?
saadnib
4
@BorisCharpentier, właśnie odkryłem, że ten problem został rozwiązany w XCode 6.1.1 :-)
saadnib
27

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/XIBsskonfigurowany do używania klas wielkości iOS 7, obecnie ich nie przestrzega size classesi 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środkowanym vertically and horizontallyw 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ę na iOS 8, ale nieiOS 7 . Potwierdziłem to zachowanie również na iOS 7urządzeniu.

remmah
źródło
Roy, dzięki za odpowiedź. Nie miałem jeszcze czasu, aby to przetestować i doceniam to. Prezenter w tym filmie powinien być wyraźniejszy. Myślę, że musiał mieć na myśli, że pliki XIB / Storyboard mogą być odczytywane przez iOS 6 i 7, ale bez wsparcia dla adaptacyjnego interfejsu użytkownika. To sprawia, że ​​kodowanie aplikacji działających na iOS <8 jest problematyczne.
Duncan C
W rzeczy samej. Zastanawiam się, czy istnieje jakakolwiek oficjalna dokumentacja dotycząca obsługi nowszych klas rozmiarów i starszego podejścia orientacji / idiomu w tym samym Storyboard / XIB. Zaktualizuję odpowiedź, jeśli coś znajdę.
remmah
Z mojego doświadczenia wynika, że ​​Apple wydaje się sądzić, że starsze wersje systemu operacyjnego przestają istnieć, gdy tylko ogłoszą nową wersję. W rzeczywistości zespół inżynierów wydaje się przestać zwracać uwagę na nową wersję systemu operacyjnego, gdy tylko zostanie wydana, i zaczyna skupiać całą swoją energię na następnej głównej wersji. NIGDY nie miałem naprawionego błędu, który zgłosiłem w bieżącej wersji głównej. Oni
Duncan C
3
Wydaje się, że nie ma to już miejsca w przypadku Xcode 6 beta 4. Zobacz odpowiedź, którą właśnie dodałem.
Jordan H,
1
@Joey dzięki za ostrzeżenia; Zredagowałem swoją odpowiedź, aby skierować czytelników do Twojej odpowiedzi, a także odpowiedzi Dave'a.
remmah
12

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:

  • Aplikacja jest zbudowana przy użyciu Xcode w wersji 6 lub nowszej
  • Cel wdrożenia aplikacji jest starszy niż iOS 8
  • Klasy rozmiaru są określone w scenorysie lub xib
  • Wartość składnika wysokości nie jest zwarta

~~~~~

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!

radiowizualne
źródło
To świetnie, to jest już udokumentowane, dzięki za wysłanie!
Jordan H
3

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 XIBplikach w ogóle nie działają. Jeśli utworzę prototyp komórki w storyboardpliku, będzie działać w iOS7, jak wyjaśniono w innych odpowiedziach, jednak gdy ta sama prototypowa komórka zostanie przeniesiona do oddzielnego XIBpliku - 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

wprowadź opis obrazu tutaj

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:

wprowadź opis obrazu tutaj

sha
źródło
$ ^% $ ^% @ # ^ & @ #% & ^% ... i tutaj mam wiele plików xib i wdrażam je na iOS 7 i 8.
TheEye
Dokładnie. Łączyłem scenorysy na iPhone'a i iPada w jedno i pomyślałem, że oddzielenie komórek do ich własnego pliku XIB pomoże :). Byłbym wdzięczny, gdybyś mógł dać +1 mojej odpowiedzi.
sha
1
Widzę to samo zachowanie.
bjtitus
2

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 ~ipadi ~iphoneprzyrostkowych 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.

Jonathan Crooke
źródło
1

@lducool - w kreatorze interfejsów w Inspektorze tożsamości zmień „Builds For” na iOS7.1 lub nowszy.

Ash R.
źródło
Brak różnicy w wydajności.
Iducool,
1

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ł.

Tom Major
źródło