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 toInterfaceOrientationkarena statusBarOrientation UIApplication masih akan mengarah ke orientasi lama karena belum berubah (karena Anda berada di dalam willpengendali 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 rootViewControllerproperti 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!