Bagaimana Xcode 6 adaptive UI dapat kompatibel dengan iOS 7 dan iOS 6?

137

Saya baru saja menonton video WWDC # 216, "Membangun UI Adaptif dengan UIKit".

Sekitar 45:10 Tony Ricciardi berbicara tentang perubahan IB di Xcode 6 untuk mendukung perubahan baru.

Dia mengatakan "Anda dapat menerapkan dokumen ini mundur ke versi iOS yang lebih lama".

(di mana "Dokumen-dokumen ini" mungkin berarti XIB dan papan cerita yang memiliki pengaturan khusus untuk kelas ukuran yang berbeda.)

Saya tidak mengada-ada. Pergi menonton video WWDC.

Bagaimana mungkin? Koleksi sifat dan kelas ukuran hanya ditentukan di iOS 8. Bagaimana perilaku runtime yang bergantung pada konstruksi UI yang baru untuk iOS 8 bekerja di versi iOS sebelumnya?

Jika ini mungkin itu akan menjadi indah. Anda dapat membuat aplikasi yang akan berjalan di iOS 6, 7, dan 8, dan memanfaatkan kemampuan tata letak UI baru yang fleksibel yang telah ditambahkan Apple ke Xcode 6. Saya telah membuat sendiri logika UI adaptif dalam kode, dan itu cukup banyak pekerjaan.

Duncan C
sumber
2
Sekarang ada juga dokumen dari Apple yang menjelaskan kompatibilitas dengan versi <8
Alladinian

Jawaban:

151

Perubahan yang dibuat pada UI dengan Kelas Ukuran di Interface Builder DO muncul dengan benar di perangkat iOS 7 dan Pratinjau di Xcode. Misalnya, saya mengubah beberapa batasan Tata Letak Otomatis dan ukuran font untuk Tinggi reguler Lebar reguler dan batasan yang diubah itu terlihat di Simulator iPad yang menjalankan iOS 7.0.

Semua pengoptimalan kelas ukuran tersedia untuk iOS 7, kecuali kelas ukuran yang memiliki Tinggi Ringkas. Ini telah dikonfirmasi oleh Apple dan sekarang dinyatakan langsung dalam dokumentasi :

Untuk aplikasi yang mendukung versi iOS sebelum iOS 8, sebagian besar kelas ukuran kompatibel dengan versi sebelumnya.

Kelas ukuran kompatibel ke belakang jika:
- Aplikasi dibuat menggunakan Xcode versi 6 atau yang lebih baru
- Target penerapan aplikasi lebih lama dari iOS 8
- Kelas ukuran ditentukan di papan cerita atau xib
- Nilai komponen tinggi tidak kompak

Karena iOS 7 tidak menghormati beberapa kelas ukuran, jika Anda menggunakannya, Anda akan mengalami masalah. Sebagai contoh: Ketika Anda memiliki Compact w Any h ditentukan dan kemudian Compact w Compact h ditentukan, di iOS 7 itu akan menghormati Compact w Any h tetapi di iOS 8 itu membuat tampilan Compact w Compact h.

Jadi, jika Anda ingin menggunakan dua kelas ukuran tersebut dan mempertahankan kompatibilitas dengan iOS 7, saya akan melakukan pengoptimalan apa pun yang Anda inginkan untuk iPhone dalam lanskap di Any w Any h atau Compact w Any h, lalu lakukan pengoptimalan lainnya untuk kelas ukuran yang berbeda. seperlunya, dan dengan begitu Anda tidak perlu menggunakan kelas ukuran apa pun dengan tinggi yang ringkas dan akan menghindari masalah.

Jordan H
sumber
Saya dapat mengonfirmasi bahwa di Beta4, kelas ukuran Compact / Compact tidak dihormati di simulator atau di perangkat iOS 7. Menarik bahwa beberapa kelas ukuran dihormati. Terima kasih telah menguji.
remmah
Menguji Reguler / Reguler pada perangkat dan tidak TIDAK menanggapi penyesuaian kelas ukuran, yang saya dapatkan hanyalah Any / Any dengan Beta 7
hokiewalrus
@hokiewalrus Saya baru saja memeriksa dengan Xcode 6 beta 7 dan mendapatkan hasil yang sama persis dengan yang saya rinci dalam jawabannya. Mengubah lebar kotak di IB untuk Reguler Reguler tidak ditampilkan dengan benar di iPad yang menjalankan iOS 7.1.
Jordan H
3
@Joey ini bukan bug; ini disengaja. Compact-Compacttidak diekspor untuk iOS 7; Compact-Regularadalah. Lihat jawaban saya untuk lebih jelasnya.
Dave DeLong
2
Seharusnya jawaban yang diterima, jawaban di atas menyesatkan.
Dominic Lacaille
68

Saat menerapkan aplikasi Anda ke iOS 7, Xcode akan menyusun storyboard Anda dengan dua cara berbeda:

  • Untuk iPhone, storyboard Anda akan dikompilasi sebagai "Compact-Regular" (Lebar kompak, tinggi reguler), dan ini akan dikemas sebagai ujung "~ iphone" Anda.

  • Untuk iPad, storyboard Anda akan dikompilasi sebagai "Reguler-Reguler" dan dikemas sebagai ujung "~ ipad" Anda.

Jadi jika Anda ingin menerapkan ke iOS 7 dan iOS 8, Anda harus memfokuskan desain Anda pada kelas ukuran Compact-Any dan Regular-Any. Itu akan memberi Anda pengalaman terbaik dalam hal mencocokkan UI di seluruh target penerapan. Anda, tentu saja, dipersilakan untuk mengubah tata letak untuk kelas ukuran lain, tetapi kecuali modifikasi tersebut akan diterapkan ke kelas ukuran Compact-Regular atau Regular-Regular, Anda tidak akan melihat modifikasi tersebut di iOS 7.

Dave DeLong
sumber
Pemahaman saya tentang jawaban Anda adalah bahwa "Reguler-Reguler" seharusnya berfungsi di iPad iOS7. Tapi itu tidak berhasil. Saya telah menguji dalam rilis GM XCode6. Harap perbaiki saya Jika saya salah menafsirkan jawaban Anda.
Iducool
4
Tampaknya reguler-reguler hanya berfungsi di papan cerita, bukan xib
Boris Charpentier
@BorisCharpentier Saya telah melaporkan bug tentang rdar itu: // 18737656 , yang ditutup sebagai duplikat dibuka # 18490866
Maxim Pavlov
@BorisCharpentier apakah Anda menemukan solusi untuk xib?
saadnib
4
@BorisCharpentier, saya baru saja menemukan bahwa masalah ini telah diselesaikan di
XCode
27

Catatan: Jawaban ini relevan dengan versi beta dari Xcode 6 dan tidak lagi berlaku untuk versi pengiriman. Lihat jawaban dari Joey dan Dave DeLong di halaman ini untuk informasi yang benar.

(jawaban asli dipertahankan di bawah):


Sementara Storyboards/XIBsdikonfigurasi untuk menggunakan kelas ukuran akan dijalankan iOS 7, OS saat ini tidak menghormati itu size classesdan tampaknya menggunakan kelas ukuran default 'Any / Any'.

Saya setuju bahwa slide tertentu yang Anda maksud tampaknya menjanjikan kompatibilitas seperti itu, tetapi tampaknya tidak demikian saat ini (Xcode 6 beta 2).

Untuk mengujinya, saya membuat sebuah proyek (iOS 8 SDK, deployment target of 7.1)dengan satu tombol yang berpusat vertically and horizontallydi kelas ukuran Any / Any, tetapi sejajar dengan sudut kiri atas di kelas ukuran Compact / Compact (misalnya iPhone dalam lanskap). Asisten Pratinjau Xcode menunjukkan bahwa tombol berubah posisinya iOS 8, tetapi tidak iOS 7. Saya juga mengonfirmasi perilaku ini di iOS 7perangkat.

remmah
sumber
Roy, terima kasih sudah membalas. Saya belum punya waktu untuk menguji ini sendiri, dan saya menghargainya. Penyaji dalam video itu seharusnya lebih jelas. Saya pikir dia pasti bermaksud bahwa file XIB / Storyboard dapat dibaca oleh iOS 6 dan 7, tetapi tanpa dukungan untuk UI adaptif. Itu membuat pengkodean untuk aplikasi yang berjalan di iOS <8 bermasalah.
Duncan C
Memang. Saya ingin tahu apakah ada dokumentasi resmi tentang cara mendukung kelas ukuran yang lebih baru dan pendekatan orientasi / idiom yang lebih lama dalam Storyboard / XIB yang sama. Saya akan memperbarui jawabannya jika saya menemukan sesuatu.
remmah
Dalam pengalaman saya, Apple tampaknya berpikir bahwa versi OS yang lebih lama tidak ada lagi begitu mereka mengumumkan versi baru. Faktanya, tim teknik tampaknya berhenti memperhatikan versi OS baru segera setelah dirilis, dan mulai memfokuskan semua energi mereka pada versi utama berikutnya. Saya TIDAK PERNAH memiliki bug yang saya kirimkan diperbaiki dalam rilis utama saat ini. Mereka
Duncan C
3
Ini tidak lagi menjadi kasus dengan Xcode 6 beta 4. Lihat jawaban yang baru saja saya tambahkan.
Jordan H
1
@Joey terima kasih atas perhatiannya; Saya telah mengedit jawaban saya untuk merujuk pembaca ke jawaban Anda, serta jawaban Dave.
remmah
12

Karena beberapa jawaban dan komentar membahas sifat kompatibilitas mundur, saya pikir saya akan membagikan kutipan langsung dari Dokumentasi Apple :

~~~~~

Menerapkan Aplikasi Dengan Kelas Ukuran pada Versi iOS Sebelumnya

Untuk aplikasi yang mendukung versi iOS sebelum iOS 8, sebagian besar kelas ukuran kompatibel dengan versi sebelumnya.

Kelas ukuran kompatibel ke belakang jika:

  • Aplikasi ini dibuat menggunakan Xcode versi 6 atau yang lebih baru
  • Target penerapan aplikasi lebih awal dari iOS 8
  • Kelas ukuran ditentukan di storyboard atau xib
  • Nilai komponen ketinggian tidak kompak

~~~~~

Poin terakhir itu ditargetkan pada diskusi ini, di mana Apple mengonfirmasi bahwa selama "tinggi kompak" tidak digunakan , Apple harus mempertahankan kompatibilitas ke belakang.

Semoga ini bisa membantu seseorang!

radiovisual
sumber
Bagus ini sekarang didokumentasikan, terima kasih telah memposting!
Yordania H
3

Saat menangani masalah serupa, saya menemukan jawaban lain yang belum saya lihat di sini. Sepertinya Kelas Ukuran dalam XIBfile tidak berfungsi sama sekali. Jika saya membuat prototipe sel di storyboardfile, itu berfungsi di iOS7 seperti yang dijelaskan dalam jawaban lain, namun ketika sel prototipe yang sama dipindahkan ke XIBkelas ukuran file terpisah diabaikan di iOS7.

Berikut ini tautan ke proyek contoh yang mendemonstrasikan perilaku ini: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip

Di sel prototipe saya memiliki empat batasan dari setiap tepi tampilan abu-abu. Masing-masing dikonfigurasi dengan cara yang sama: Apa saja / Apa saja - 10, Reguler / Reguler - 20

masukkan deskripsi gambar di sini

Ini berfungsi dengan baik di simulator iOS8 untuk XIB dan Storyboard, dan di iOS7 hanya sel yang ditentukan di Storyboard yang mendapat pembaruan batasan di iPad:

masukkan deskripsi gambar di sini

sha
sumber
$ ^% $ ^% @ # ^ & @ #% & ^% ... dan di sinilah saya dengan banyak file xib dan diterapkan di iOS 7 dan 8.
TheEye
Persis. Saya menggabungkan storyboard iPhone dan iPad menjadi satu dan berpikir bahwa memisahkan sel ke dalam file XIB mereka sendiri akan membantu :). Saya akan sangat menghargai jika Anda dapat memberi jawaban saya +1.
sha
1
Saya melihat perilaku yang sama ini.
bjtitus
2

Jika itu menghemat waktu siapa pun, saya percaya bahwa cara Xcode 6 menyediakan kompatibilitas semu mundur untuk kelas ukuran adalah melalui storyboard historis ~ipaddan ~iphonesufiks, dan tidak lebih. Ini masuk akal karena kelas ukuran adalah cara yang lebih abstrak tentang bagaimana kita sebelumnya mendefinisikan papan cerita iPad, dan papan cerita iPhone.

Karena itu:

  • Jika tujuan Anda adalah menggunakan kelas ukuran untuk mendukung tata letak khusus keluarga perangkat (iPad vs. iPhone), maka Anda beruntung: kelas ukuran adalah antarmuka yang lebih bagus untuk metode yang didukung sebelumnya.

  • Jika tujuan Anda adalah menggunakan kelas ukuran untuk mendukung tata letak yang diubah untuk model yang berbeda dalam keluarga perangkat yang sama - mis. iPhone 5/6/6 + inc. lanskap, maka Anda kurang beruntung . Menggunakan ini akan membutuhkan target penerapan iOS 8 minimum.

Jonathan Crooke
sumber
1

@lducool - Dalam pembuat antarmuka, di inspektur Identitas, ubah 'Dibuat Untuk' ke iOS7.1 dan yang lebih baru.

Ash R
sumber
Tidak ada perbedaan output.
Iducool
1

Sayangnya jawaban dari Dave dan Joey tidak berhasil untuk saya. Saya tidak diizinkan berkomentar di utas ini, jadi maafkan saya jika ini adalah tempat yang salah.

Saya telah membuat pertanyaan khusus untuk itu: Contoh untuk UI adaptif lanskap potret iPhone yang kompatibel dengan iOS 7

Dari apa yang saya pelajari sejauh ini, saya yakin sekarang, seperti dalam contoh saya, tidak mungkin memiliki 2 batasan yang berbeda dan terpisah untuk satu elemen ui dalam mode potret dan lanskap dengan iPhone iOS7 berdasarkan kelas ukuran. Akan senang jika saya salah.

Tom Major
sumber