UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)Yönlendirmeyi belirlemek gibi bir şey kullanabilir ve ardından boyutları buna göre kullanabilirsiniz.
ANCAK, UIViewController'daki gibi bir yönelim değişikliği sırasında
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
toInterfaceOrientationUIApplication'ın statusBarOrientation öğesi, henüz değişmediği için (bir willolay işleyicisinin içinde olduğunuzdan) eski yönlendirmeyi göstermeye devam edeceğinden, iletilen yönlendirmeyi kullanın .
Özet
Bununla ilgili birkaç gönderi var, ancak her biri yapmanız gerektiğini gösteriyor gibi görünüyor:
[[UIScreen mainScreen] bounds]Boyutları almak için bakın ,
- Hangi yönelimde olduğunuzu kontrol edin ve
- Durum çubuğu yüksekliğini hesaba katın (gösteriliyorsa)
Bağlantılar
Çalışma Kodu
Genelde bu kadar ileri gitmem ama ilgimi çektin. Aşağıdaki kod hile yapmalıdır. UIApplication üzerine bir Kategori yazdım. Belirli bir yönelimde currentSize veya boyutu elde etmek için sınıf yöntemleri ekledim, UIViewController'da bunu çağırırdınız 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
Kodu kullanmak için basit arama [UIApplication currentSize]. Ayrıca, yukarıdaki kodu çalıştırdım, bu yüzden çalıştığını biliyorum ve tüm yönlerde doğru yanıtları geri bildiriyorum. Durum çubuğunu hesaba kattığımı unutmayın. İlginç bir şekilde, durum çubuğunun yükseklik ve genişliğinin MIN değerini çıkarmak zorunda kaldım.
Bu yardımcı olur umarım. : D
Diğer düşünceler
UIWindow'un rootViewControllerözelliğine bakarak boyutları almaya gidebilirsiniz . Geçmişte buna baktım ve aynı boyutları hem dikey hem de yatay olarak rapor ediyor, tek farkı bir döndürme dönüşümü olduğunu bildiriyor:
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] görünümü]
<UILayoutContainerView: 0xf7296f0; çerçeve = (0 0; 320 480); dönüşüm = [0, -1, 1, 0, 0, 0]; otomatik yeniden boyutlandırma = W + H; katman = <CALayer: 0xf729b80 >>
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] görünümü]
<UILayoutContainerView: 0xf7296f0; çerçeve = (0 0; 320 480); otomatik yeniden boyutlandırma = W + H; katman = <CALayer: 0xf729b80 >>
Uygulamanızın nasıl çalıştığından emin değilim, ancak bir tür gezinme denetleyicisi kullanmıyorsanız, ana görünümünüzün altında ebeveynin maksimum yüksekliği / genişliğine sahip ve ebeveynle birlikte büyür / küçülür. Sonra yapabilirdi: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]. Bu bir satırda oldukça yoğun görünüyor, ama fikri anladınız.
Ancak ... Yukarıdaki 3 adımı özetin altında yapmak yine de daha iyi olacaktır. UIWindows ile uğraşmaya başlayın ve bir UIAlertView göstermek gibi garip şeyler keşfedeceksiniz, UIApplication'ın anahtar penceresini UIAlertView'ın oluşturduğu yeni bir UIWindow'a işaret edecek şekilde değiştirecek. Kim biliyordu? KeyWindow'a güvenerek bir hata bulup bunun böyle değiştiğini keşfettikten sonra yaptım!