Bisakah seseorang memberi tahu saya pendekatan "benar" atau "terbaik" untuk bekerja dengan orientasi antarmuka potret dan lanskap di iOS 8? Tampaknya semua fungsi yang ingin saya gunakan untuk tujuan itu sudah tidak digunakan lagi di iOS 8, dan penelitian saya tidak menemukan alternatif yang jelas dan elegan. Apakah saya benar-benar harus melihat lebar dan tinggi untuk menentukan sendiri apakah kita dalam mode potret atau lanskap?
Misalnya, dalam pengontrol tampilan saya, bagaimana cara mengimplementasikan kodesemu berikut?
if we are rotating from portrait to landscape then
do portrait things
else if we are rotating from landscape to portrait then
do landscape things
UIViewController
. Lihat bagian berjudul "Menangani Rotasi Tampilan. Ini menjelaskan apa yang harus Anda lakukan.Jawaban:
Apple merekomendasikan penggunaan kelas ukuran sebagai ukuran kasar dari seberapa banyak ruang layar yang tersedia, sehingga UI Anda dapat mengubah tata letak dan tampilannya secara signifikan. Pertimbangkan bahwa iPad dalam potret memiliki kelas ukuran yang sama seperti pada lanskap (Lebar reguler, tinggi reguler). Artinya, UI Anda harus lebih atau kurang mirip di antara kedua orientasi.
Namun, perubahan dari potret ke lanskap di iPad cukup signifikan sehingga Anda mungkin perlu melakukan beberapa penyesuaian yang lebih kecil pada UI, meskipun kelas ukurannya tidak berubah. Karena metode yang terkait dengan orientasi antarmuka
UIViewController
sudah tidak digunakan lagi, Apple sekarang merekomendasikan penerapan metode baru berikutUIViewController
sebagai penggantinya:Bagus! Sekarang Anda mendapatkan callback tepat sebelum rotasi dimulai, dan setelah selesai. Tapi bagaimana dengan mengetahui sebenarnya apakah rotasi untuk potret atau lanskap?
Apple merekomendasikan pemikiran tentang rotasi hanya sebagai perubahan ukuran tampilan induk. Dengan kata lain, selama rotasi iPad dari potret ke lanskap, Anda dapat menganggapnya sebagai tampilan tingkat akar yang hanya mengubah
bounds.size
dari{768, 1024}
menjadi{1024, 768}
. Mengetahui hal ini kemudian, Anda harus menggunakansize
passing keviewWillTransitionToSize:withTransitionCoordinator:
metode di atas untuk mengetahui apakah Anda memutar ke potret atau lanskap.Jika Anda menginginkan cara yang lebih mulus untuk memigrasi kode lama ke cara baru iOS 8 dalam melakukan sesuatu, pertimbangkan untuk menggunakan kategori sederhana ini di UIView, yang dapat digunakan untuk menentukan apakah tampilan adalah "potret" atau "lanskap" berdasarkan ukuran.
Rangkuman:
viewWillTransitionToSize:withTransitionCoordinator:
callback di UIViewController.statusBarOrientation
- yang pada dasarnya adalah properti tingkat perangkat - untuk menentukan apakah akan menata tampilan untuk "potret" vs "lanskap". Orientasi bilah status sebaiknya hanya digunakan oleh kode yang menangani hal-hal sepertiUIWindow
yang sebenarnya ada di tingkat paling dasar aplikasi.sumber
UIViewControllerTransitionCoordinator
adalah mimpi buruk :-(viewdidlayoutsubviews
kemudian? Saya pikirviewdidlayoutsubviews
digunakan untuk menangkap perubahan terikat karena rotasi. Bisakah Anda menjelaskan lebih lanjut tentang itu?Berdasarkan jawaban smileyborg yang sangat detail (dan diterima), berikut ini adaptasi menggunakan swift 3:
Dan dalam
UICollectionViewDelegateFlowLayout
implementasinya,sumber
Saya hanya menggunakan Pusat Pemberitahuan:
Tambahkan variabel orientasi (akan dijelaskan di bagian akhir)
Tambahkan Pemberitahuan saat tampilan muncul
Hapus Pemberitahuan saat tampilan hilang
Mendapat orientasi saat ini ketika notifikasi dipicu
Memeriksa orientasi (potret / lanskap) dan menangani acara
Alasan saya menambahkan variabel orientasi adalah karena saat menguji pada perangkat fisik, notifikasi orientasi dipanggil pada setiap gerakan kecil di perangkat, dan tidak hanya saat itu berputar. Menambahkan pernyataan var dan if hanya memanggil kode jika dialihkan ke orientasi yang berlawanan.
sumber
super
dariviewDidAppear
danviewWillDisappear
harus dipanggilDari perspektif UI, saya percaya bahwa menggunakan Kelas Ukuran adalah pendekatan yang direkomendasikan Apple untuk menangani antarmuka dalam orientasi, ukuran, dan skala yang berbeda.
Lihat bagian: Sifat Jelaskan Kelas Ukuran dan Skala Antarmuka di sini: https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html
Yang ini artikel yang bagus juga: https://carpeaqua.com/thinking-in-terms-of-ios-8-size-classes/
EDIT Tautan yang Diperbarui: https://carpeaqua.com/2014/06/14/thinking-in-terms-of-ios-8-size-classes/ (Sumber: Koen)
sumber