Xcode 6 uyumlu UI'ler iOS 7 ve iOS 6 ile nasıl geriye dönük uyumlu olabilir?


137

WWDC # 216, "UIKit ile Uyarlanabilir Kullanıcı Arayüzü Oluşturma" videosunu izledim.

Yaklaşık 45:10 Tony Ricciardi, yeni değişiklikleri desteklemek için Xcode 6'da IB'deki değişiklikler hakkında konuşuyor.

"Bu dokümanları iOS'un eski sürümlerine geri dağıtabilirsiniz" diyor.

(burada "Bu belgeler" muhtemelen farklı boyut sınıfları için belirli ayarlara sahip XIB'ler ve film şeritleri anlamına gelir.)

Bunu uydurmuyorum. WWDC videosunu izleyin.

Bu nasıl mümkün olabilir? Özellik koleksiyonları ve boyut sınıfları yalnızca iOS 8'de tanımlanır. İOS 8'de yeni olan UI yapılarına bağımlı çalışma zamanı davranışı önceki iOS sürümlerinde nasıl çalışır?

O takdirde ise mümkün harika olurdu. İOS 6, 7 ve 8'de çalışacak uygulamalar oluşturabilir ve Apple'ın Xcode 6'ya eklediği yeni esnek UI mizanpaj yeteneklerinden yararlanabilirsiniz. işin.


2
Ayrıca Apple'dan <8
Alladinian

Yanıtlar:


151

Arayüz Oluşturucu'da Boyut Sınıflarıyla UI'de yapılan değişiklikler, iOS 7 cihazlarında ve Xcode'da Önizleme'de doğru bir şekilde görünür. Örneğin, Normal yükseklik için bazı Otomatik Düzen kısıtlamalarını ve yazı tipi boyutlarını değiştirdim Düzenli genişlik ve değiştirilen bu kısıtlamalar iOS 7.0 çalıştıran iPad Simulator'da görülebilir.

Kompakt Yüksekliğe sahip boyut sınıfları hariç, tüm boyut sınıfı optimizasyonları iOS 7 tarafından kullanılabilir. Bu Apple tarafından onaylandı ve şimdi doğrudan belgelerde belirtildi :

İOS 8'den önceki iOS sürümlerini destekleyen uygulamalar için çoğu boyut sınıfı geriye dönük olarak uyumludur.

Boyut sınıfları şu durumlarda geriye dönük olarak uyumludur:
- Uygulama Xcode sürüm 6 veya üstü kullanılarak oluşturulmuştur
- Uygulamanın dağıtım hedefi iOS 8'den önce
- Boyut sınıfları bir storyboard veya xib'de belirtilmişse
- height bileşeninin değeri kompakt değil

İOS 7 birkaç boyut sınıfına saygı duymadığından, bunları kullanırsanız sorunlarla karşılaşırsınız. Örneğin: Compact w Any h tanımlı ve sonra Compact w Compact h tanımlıyken, iOS 7'de Compact w Any h'ye saygı duyulur ancak iOS 8'de Compact w Compact h görünümünü verir.

Bu nedenle, bu iki boyut sınıfını kullanmak ve iOS 7 ile uyumluluğunu korumak istiyorsanız, iPhone'da yatay olarak istediğiniz herhangi bir optimizasyon veya herhangi bir h veya Kompakt w Herhangi bir h yapın, ardından farklı boyut sınıfları için diğer optimizasyonlarınızı gerçekleştiririm ve böylece kompakt yükseklikte herhangi bir boyut sınıfı kullanmanıza gerek kalmayacak ve sorun yaşamamaktan kaçınacaktır.


Beta4'te, Kompakt / Kompakt boyut sınıfının simülatörde veya bir iOS 7 cihazında saygı görmediğini onaylayabilirim. Bazı boyut sınıflarına saygı duyulması ilginçtir. Test için teşekkürler.
remmah

Bir cihazda Düzenli / Düzenli için test yapın ve boyut sınıfı özelleştirmelerine yanıt
VERMEZ

@hokiewalrus Xcode 6 beta 7 ile kontrol ettim ve cevapta ayrıntılı olarak belirttiğim sonuçların aynısını elde ettim. Regular Regular için IB'de kutunun genişliğini değiştirmek, iOS 7.1 çalıştıran iPad'de doğru bir şekilde gösterilir.
Ürdün H

3
@Joey bu bir hata değil; bu kasıtlı. Compact-CompactiOS 7 için dışa aktarılmaz; Compact-Regulardır-dir. Daha fazla ayrıntı için cevabıma bakın.
Dave DeLong

2
Kabul edilen cevap olmalı, yukarıdaki cevap yanıltıcıdır.
Dominic Lacaille

68

Uygulamanızı iOS 7'ye dağıtırken, Xcode film şeridinizi iki farklı şekilde derleyecektir:

  • İPhone için, film şeridiniz "Kompakt Düzenli" (Kompakt genişlik, normal yükseklik) olarak derlenir ve bu "~ iphone" uç olarak paketlenir.

  • İPad için film şeridiniz "Regular-Regular" olarak derlenir ve "~ ipad" ucu olarak paketlenir.

Dolayısıyla, hem iOS 7 hem de iOS 8'e dağıtmak istiyorsanız, tasarımınızı Compact-Any ve Regular-Any boyut sınıflarına odaklamalısınız. Bu, kullanıcı arayüzünü dağıtım hedefleri arasında eşleme konusunda size en iyi deneyimi sunacaktır. Elbette, diğer boyut sınıflarının düzenini değiştirmeye hoş geldiniz, ancak bu değişiklikler Kompakt Düzenli veya Düzenli Düzenli boyut sınıflarına uygulanmazsa, iOS 7'de bu değişiklikleri görmezsiniz.


Cevabınızı anladığım, "Düzenli Düzenli" nin iPad iOS7'de çalışması gerektiğidir. Ama bu çalışmıyor. XCode6 GM sürümünde test yaptım. Lütfen beni düzeltin Cevabını yanlış yorumlasaydım.
Iducool

4
Görünüşe göre düzenli düzenli sadece xib üzerinde değil storyboard üzerinde çalışıyor
Boris Charpentier

@BorisCharpentier Ben açıldı kopyası olarak kapatıldı o rdar: // 18737656 hakkında bir hata bildirdi # 18490866
Maxim Pavlov 17

@BorisCharpentier xib için herhangi bir çözüm buldunuz mu?
saadnib

4
@BorisCharpentier, ben sadece bu sorunun XCode
6.1.1'de

27

Not: Bu yanıt Xcode 6'nın beta sürümü ile ilgilidir ve artık gönderim sürümü için geçerli değildir. Doğru bilgi için Joey ve Dave DeLong'un cevaplarına bakınız .

(orijinal cevap aşağıda saklanmıştır):


Storyboards/XIBsBoyut sınıflarını kullanacak şekilde yapılandırılmış olsa da iOS 7, işletim sistemi şu anda bunlara uymuyor size classesve varsayılan 'Herhangi Bir / Herhangi Bir' boyut sınıfını kullanıyor gibi görünüyor.

Bahsettiğiniz slaytın bu tür bir uyumluluk vaat ettiğini görüyorum, ancak şu anda böyle görünmüyor (Xcode 6 beta 2).

Test etmek için, Herhangi Bir / Herhangi Bir boyut sınıfında ortalanmış, ancak Kompakt / Kompakt boyut sınıfında (örneğin iPhone'da yatay) sol üst köşeye hizalanmış (iOS 8 SDK, deployment target of 7.1)tek bir düğmeyle bir proje oluşturdum vertically and horizontally. Xcode'un Önizleme Yardımcısı, düğmenin konumunu değiştirdiğini iOS 8ancak değiştirmediğini gösterir iOS 7. Bu davranışı bir iOS 7cihazda da doğruladım .


Roy, cevap verdiğin için teşekkürler. Bunu kendim test etmek için henüz vaktim olmadı ve takdir ediyorum. Bu videodaki sunum yapan kişinin daha net olması gerekirdi. Sanırım XIB / Storyboard dosyalarının iOS 6 ve 7 tarafından okunabileceği, ancak uyarlanabilir UI desteği olmadan olması gerektiği anlamına geliyordu. İOS 8'de çalışan uygulamalar için kodlamayı sorunlu hale getirir.
Duncan C

Aslında. Aynı Storyboard / XIB'de daha yeni boyut sınıflarının ve eski yönelim / deyim yaklaşımının nasıl destekleneceğine dair resmi bir belge olup olmadığını merak ediyorum. Bir şey bulursam cevabı güncelleyeceğim.
remmah

Deneyimlerime göre Apple, eski işletim sistemi sürümlerinin yeni bir sürümü duyurur duymaz var olmadığını düşünüyor. Aslında, mühendislik ekibi, piyasaya sürülür çıkmaz yeni bir işletim sistemi sürümüne dikkat etmeyi bırakıyor ve tüm enerjilerini bir sonraki büyük sürüme odaklamaya başlıyor gibi görünüyor. Mevcut büyük sürümde HİÇBİR hatamı düzeltmedim. Onlar
Duncan C

3
Bu artık Xcode 6 beta 4 için geçerli görünmüyor. Az önce eklediğim yanıta bakın.
Jordan H

1
@Joey dikkat edin için teşekkürler; Dave'in yanı sıra okuyucuları da cevabınıza yönlendirmek için cevabımı düzenledim.
remmah

12

Bazı cevaplar ve yorumlar geriye dönük uyumluluğun doğasını tartışırken, doğrudan Apple Dokümantasyonundan bir alıntı paylaşacağımı düşündüm :

~~~~~

Boyut Sınıflarına Sahip Bir Uygulamayı Daha Önceki iOS Sürümlerinde Dağıtma

İOS 8'den önceki iOS sürümlerini destekleyen uygulamalar için çoğu boyut sınıfı geriye dönük olarak uyumludur.

Boyut sınıfları şu durumlarda geriye dönük olarak uyumludur:

  • Uygulama Xcode sürüm 6 veya üstü kullanılarak oluşturulmuştur
  • Uygulamanın dağıtım hedefi iOS 8'den daha eski
  • Boyut sınıfları film şeridinde veya xib'de belirtilir
  • Height bileşeninin değeri kompakt değil

~~~~~

Bu son madde işareti noktası Elma dogruluyor Bu tartışma, hedeflemektedir uzun "kompakt yükseklik" olduğu gibi değil kullanılan , geriye doğru uyumluluk sağlamak gerekir.

Umarım bu birine yardımcı olur!


Bu şimdi belgelenmiş harika, Gönderdiğiniz için teşekkürler!
Ürdün H

3

Benzer bir konuyu ele alırken, burada henüz görmediğim başka bir cevap buldum. Görünüşe göre XIBdosyalardaki Boyut Sınıfları hiç çalışmıyor. storyboardDosyada hücre prototipi oluşturursam , diğer yanıtlarda açıklandığı gibi iOS7'de çalışır, ancak aynı prototip hücre ayrı XIBdosya boyutuna taşındığında iOS7'de yok sayılır.

Bu davranışı gösteren örnek projeye link: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

Prototip hücrede, gri görünümün her bir kenarından dört kısıtlama var. Her biri aynı şekilde yapılandırılır: Herhangi biri / Herhangi biri - 10, Düzenli / Düzenli - 20

resim açıklamasını buraya girin

Hem XIB hem de Storyboard için iOS8 simülatöründe iyi çalışır ve iOS7'de yalnızca Storyboard'da tanımlanan hücreler iPad'de güncellenmiş kısıtlamalar alır:

resim açıklamasını buraya girin


$ ^% $ ^% @ # ^ & @ #% & ^% ... ve burada birçok xib dosyası ve iOS 7 ve 8'de konuşlandırıyorum.
TheEye

Kesinlikle. İPhone ve iPad film şeritlerini bir araya getirdim ve hücreleri kendi XIB dosyalarına ayırmanın yardımcı olacağını düşündüm :). Cevabımı + 1'leyebiliyorsanız sevinirim.
sha

1
Aynı davranışı görüyorum.
bjtitus

2

Kimseye zaman kazandırırsa, Xcode 6'nın boyut sınıfları için geriye dönük uyumluluk sağlama şeklinin tarihsel ve ekli film şeridi üzerinden olduğuna ve başka bir şey olmadığına inanıyorum . Boyut sınıfları, daha önce bir iPad storyboard'u ve bir iPhone storyboard'u nasıl tanımladığımızın daha soyut bir yolu olduğu için bu mantıklıdır.~ipad~iphone

Bu nedenle:

  • Amacınız, cihaz ailesine özgü düzenleri (iPad ve iPhone) desteklemek için boyut sınıflarını kullanmaksa, şanslısınız: boyut sınıfları, daha önce desteklenen yöntemin daha hoş bir arayüzdür.

  • Amacınız aynı cihaz ailesindeki farklı modeller için değiştirilmiş düzenleri desteklemek üzere boyut sınıflarını kullanmaksa - ör. iPhone 5/6/6 + inc. manzara, o zaman şansın kalmadı . Bunları kullanmak için minimum bir iOS 8 dağıtım hedefi gerekir.


1

@lducool - Arayüz oluşturucuda, Kimlik denetçisinde 'Şunun için Oluşturur' seçeneğini iOS7.1 ve sonraki sürümleriyle değiştirin.


Çıktıda fark yok.
Iducool

1

Ne yazık ki Dave ve Joey'nin cevapları benim için çalışmıyor. Bu konuya yorum yapmama izin verilmiyor, bu yüzden bu yanlış yer ise lütfen beni affet.

Bunun için özel bir soru oluşturdum: iOS 7 ile geriye dönük uyumlu iPhone dikey manzara uyarlamalı kullanıcı arayüzü örneği

Şimdiye kadar öğrendiğim kadarıyla, örneğimde olduğu gibi, boyut sınıflarına dayalı iPhone iOS7 ile portre ve manzara modunda bir kullanıcı arabirimi öğesi için 2 ayrı, farklı kısıtlamaya sahip olmanın mümkün olmadığına inanıyorum. Yine de yanılıyorsam çok sevinirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.