Saya menjalankan kode berikut di iOS 7 dan iOS 8:
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
BOOL landscape = (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight);
NSLog(@"Currently landscape: %@, width: %.2f, height: %.2f",
(landscape ? @"Yes" : @"No"),
[[UIScreen mainScreen] bounds].size.width,
[[UIScreen mainScreen] bounds].size.height);
Berikut ini adalah hasil dari iOS 8:
Currently landscape: No, width: 320.00, height: 568.00
Currently landscape: Yes, width: 568.00, height: 320.00
Dibandingkan dengan hasil di iOS 7:
Currently landscape: No, width: 320.00, height: 568.00
Currently landscape: Yes, width: 320.00, height: 568.00
Apakah ada dokumentasi yang menjelaskan perubahan ini? Atau apakah itu bug sementara di iOS 8 API?
Jawaban:
Ya, itu tergantung pada orientasi di iOS8, bukan bug. Anda bisa meninjau sesi 214 dari WWDC 2014 untuk info lebih lanjut: "Lihat Kemajuan Kontroler di iOS 8"
Kutipan dari presentasi:
UIScreen sekarang berorientasi antarmuka:
sumber
Ya, itu tergantung pada orientasi di iOS8.
Saya menulis metode Util untuk mengatasi masalah ini untuk aplikasi yang perlu mendukung versi OS yang lebih lama.
sumber
Ya, memang, ukuran layar sekarang orientasi tergantung pada iOS 8. Kadang-kadang, bagaimanapun, itu diinginkan untuk mendapatkan ukuran yang diperbaiki untuk orientasi potret. Inilah cara saya melakukannya.
sumber
Ya, sekarang tergantung pada orientasi.
Saya lebih suka metode di bawah ini untuk mendapatkan ukuran layar dalam orientasi-independen dengan beberapa jawaban di atas, baik karena lebih sederhana dan karena itu tidak bergantung pada salah satu kode orientasi (keadaan yang dapat bergantung pada waktu mereka dipanggil) atau memeriksa versi. Anda mungkin menginginkan perilaku iOS 8 yang baru, tetapi ini akan berhasil jika Anda perlu membuatnya stabil di semua versi iOS.
sumber
Terkait dengan pertanyaan ini saat memecahkan masalah saya, berikut ini dua definisi yang saya gunakan untuk perhitungan lebar dan tinggi layar:
Jika Anda mendukung iOS 7 dan iOS 8, ini adalah solusi terbaik untuk masalah ini.
sumber
Anda dapat menggunakan
nativeBounds
(orientasi-independen)nativeBounds
Mendeteksi ketinggian perangkat:
Mendeteksi lebar perangkat:
sumber
Ini bukan bug di iOS 8 SDK. Mereka membuat batas orientasi antarmuka tergantung. Menurut pertanyaan Anda tentang beberapa referensi atau dokumentasi untuk fakta itu saya akan sangat menyarankan Anda untuk menontonnya
View Controller Advancements in iOS 8
214 sesi dari WWDC 2014 . Bagian yang paling menarik (sesuai dengan keraguan Anda) adalahScreen Coordinates
mulai dari 50:45.sumber
Ya, itu tergantung pada orientasi di iOS8.
Inilah cara Anda dapat memiliki cara yang konsisten untuk membaca batasan dalam mode iOS 8 di seluruh versi SDK dan OS.
sumber
Solusi saya adalah kombinasi dari MaxK dan hfossli. Saya membuat metode ini pada Kategori UIScreen dan tidak memiliki pemeriksaan versi (yang merupakan praktik buruk):
sumber
Aku membutuhkan fungsi pembantu cepat yang terus perilaku yang sama seperti iOS7 bawah iOS8 - ini memungkinkan saya untuk menukar keluar saya
[[UIScreen mainScreen] bounds]
panggilan dan tidak menyentuh kode lain ...sumber
Metode di bawah ini dapat digunakan untuk menemukan batas layar untuk orientasi yang diberikan, terlepas dari versi iOS. Metode ini akan mengembalikan batasan berdasarkan ukuran layar perangkat dan akan memberikan nilai CGRect yang sama tanpa versi iOS.
sumber
Itulah yang saya gunakan untuk menghitung rect yang benar:
sumber
Hanya menambahkan versi cepat fungsi cbartel yang sangat baik yang dijawab di atas.
sumber
Masalah saya terkait dengan bingkai UIWindows yang sedang minus. Jadi dibuat kode seperti di bawah ini di MyViewController - (NSUInteger) yang didukung Metode InterfaceOrientations
Dan ini pekerjaan untuk saya coba.
sumber
iOS 8 atau lebih tinggi
Solusi bagi mereka yang ingin mengetahui ukuran layar dalam poin (layar 3,5 inci memiliki 320 × 480 poin, layar 4,0 inci memiliki 320 × 568 poin, dll.)
sumber
Satu hal yang saya perhatikan adalah, urutan orientasi antarmuka yang didukung di Info.plist tidak masalah. Saya mendapat masalah dengan aplikasi ini (yang melakukan orientasi dalam kode), tetapi saya tidak menentukan di mana pun bahwa orientasi default adalah Portrait.
Saya pikir orientasi default adalah Portrait dalam hal apa pun.
Mengatur ulang itens di Info.plist, menempatkan Portrait terlebih dahulu, mengembalikan perilaku yang diharapkan.
sumber
Ini akan memberikan perangkat yang benar di iOS7 dan iOS8 keduanya,
// Anda juga dapat menambahkan lebih banyak perangkat (ieiPad).
sumber
Menggunakan solusi mnemia yang sedikit dimodifikasi, yang tanpa versi iOS periksa, menggunakan min / max pada batas layar utama.
Aku butuh
CGRect
sehingga mendapatCGRect
dari batas Mainscreen dan berubahsize.width=min(w,h)
,size.height=max(w,h)
. Lalu saya sebut bahwa OS-independen mendapatkanCGRect
fungsi di dua tempat dalam kode saya, di mana saya mendapatkan ukuran layar untukOpenGL
, menyentuh dll. Sebelum memperbaiki saya punya 2 masalah - pada iOS 8.x dalam mode tampilan posisi posisi tampilan landscapeOpenGL
salah: 1 / 4 layar penuh di bagian kiri bawah. Dan sentuhan kedua mengembalikan nilai yang tidak valid. Kedua masalah diperbaiki seperti yang dijelaskan. Terima kasih!sumber