Anda dapat menggunakan sesuatu seperti UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)
untuk menentukan orientasi dan kemudian menggunakan dimensi yang sesuai.
NAMUN, selama perubahan orientasi seperti di UIViewController
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
Gunakan orientasi yang diteruskan toInterfaceOrientation
karena statusBarOrientation UIApplication masih akan mengarah ke orientasi lama karena belum berubah (karena Anda berada di dalam will
pengendali kejadian).
Ringkasan
Ada beberapa postingan terkait ini, tetapi masing-masing sepertinya menunjukkan bahwa Anda harus:
- Lihat
[[UIScreen mainScreen] bounds]
untuk mendapatkan dimensinya,
- Periksa orientasi Anda saat ini, dan
- Akun untuk tinggi bilah status (jika ditampilkan)
Tautan
Kode Kerja
Saya biasanya tidak melangkah sejauh ini, tetapi Anda membuat saya tertarik. Kode berikut harus melakukan triknya. Saya menulis Kategori di UIApplication. Saya menambahkan metode kelas untuk mendapatkan currentSize atau ukuran dalam orientasi tertentu, yang akan Anda panggil di UIViewController willRotateToInterfaceOrientation:duration:
.
@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end
@implementation UIApplication (AppDimensions)
+(CGSize) currentSize
{
return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIApplication *application = [UIApplication sharedApplication];
if (UIInterfaceOrientationIsLandscape(orientation))
{
size = CGSizeMake(size.height, size.width);
}
if (application.statusBarHidden == NO)
{
size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
}
return size;
}
@end
Untuk menggunakan kode panggilan sederhana [UIApplication currentSize]
. Juga, saya menjalankan kode di atas, jadi saya tahu itu berfungsi dan melaporkan kembali tanggapan yang benar di semua orientasi. Perhatikan bahwa saya memperhitungkan bilah status. Menariknya, saya harus mengurangi MIN dari tinggi dan lebar bilah status.
Semoga ini membantu. : D
Pikiran lain
Anda bisa mendapatkan dimensi dengan melihat rootViewController
properti UIWindow . Saya telah melihat ini di masa lalu dan itu juga melaporkan dimensi yang sama baik dalam potret maupun lanskap kecuali itu melaporkan memiliki transformasi bergilir:
(gdb) po [[[[[UIApplication sharedApplication] keyWindow] rootViewController] tampilan]
<UILayoutContainerView: 0xf7296f0; bingkai = (0 0; 320 480); transformasi = [0, -1, 1, 0, 0, 0]; ukuran otomatis = W + H; layer = <CALayer: 0xf729b80 >>
(gdb) po [[[[[UIApplication sharedApplication] keyWindow] rootViewController] tampilan]
<UILayoutContainerView: 0xf7296f0; bingkai = (0 0; 320 480); ukuran otomatis = W + H; layer = <CALayer: 0xf729b80 >>
Tidak yakin bagaimana aplikasi Anda bekerja, tetapi jika Anda tidak menggunakan semacam pengontrol navigasi, Anda dapat memiliki UIView di bawah tampilan utama Anda dengan tinggi / lebar maksimum induk dan tumbuh / menyusut dengan induk. Maka Anda bisa melakukan: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]
. Itu terlihat cukup intens di satu baris, tetapi Anda mengerti.
Namun ... Akan lebih baik jika melakukan 3 langkah di atas di bawah ringkasan. Mulailah mengotak-atik UIWindows dan Anda akan menemukan hal-hal aneh, seperti menampilkan UIAlertView akan mengubah keywindow UIApplication untuk menunjuk ke UIWindow baru yang dibuat oleh UIAlertView. Siapa yang tahu? Saya melakukannya setelah menemukan bug yang mengandalkan keyWindow dan menemukan bahwa itu berubah seperti itu!
applicationFrame
alih-alihbounds
(di UIScreen), Anda tidak perlu mengurangi tinggi bilah status.mainScreen().bounds.size
telah menjadi orientasi tergantung dari iOS 8 dan seterusnyaIni adalah kode solusi saya! Metode ini dapat ditambahkan ke Categroy kelas NSObject, atau Anda dapat menentukan kelas UIViewController kustom Teratas, dan membiarkan semua UIViewController Anda yang lain untuk mewarisinya.
Perhatikan , setelah IOS8, karena Dokumen Apple dari properti batas UIScreen mengatakan:
jadi untuk pertimbangan kompatibilitas, sebaiknya kita mendeteksi versi IOS dan melakukan perubahan seperti di bawah ini:
sumber
Berikut makro yang berguna:
sumber
Di iOS 8+ Anda harus menggunakan
viewWillTransitionToSize:withTransitionCoordinator
metode:Ini menggantikan metode animasi yang tidak digunakan lagi yang tidak memberikan informasi tentang ukuran:
sumber
Pada batas layar iOS 8 sekarang dikembalikan dengan benar untuk orientasi saat ini. Ini berarti iPad dalam orientasi lanskap [UIScreen mainScreen]. Batas akan menghasilkan 768 pada iOS <= 7 dan 1024 pada iOS 8.
Gambar berikut mengembalikan tinggi dan lebar yang benar pada semua versi yang dirilis.
sumber
jika Anda menginginkan ukuran yang bergantung pada orientasi dan Anda memiliki tampilan, Anda dapat menggunakan:
sumber
Saya menulis kategori
UIScreen
, yang bekerja pada semua versi iOS, sehingga Anda dapat menggunakannya seperti ini:[[UIScreen mainScreen] currentScreenSize]
.sumber
Berikut adalah cara cepat untuk mendapatkan ukuran layar yang bergantung pada orientasi:
Ini termasuk sebagai fungsi standar dalam proyek saya:
https://github.com/goktugyil/EZSwiftExtensions
sumber
sumber
Namun, di iOS 8.0.2:
sumber
gunakan -> setNeedsDisplay () untuk tampilan yang ingin Anda ubah ukurannya.
sumber