คุณสามารถใช้บางอย่างเช่นUIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)
เพื่อกำหนดแนวจากนั้นใช้มิติข้อมูลตามนั้น
อย่างไรก็ตามในระหว่างการเปลี่ยนทิศทางเช่นใน UIViewController
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
ใช้การวางแนวที่ส่งผ่านtoInterfaceOrientation
เนื่องจาก statusBarOrientation ของ UIApplication จะยังคงชี้ไปที่การวางแนวเดิมเนื่องจากยังไม่มีการเปลี่ยนแปลง (เนื่องจากคุณอยู่ในwill
ตัวจัดการเหตุการณ์)
สรุป
มีโพสต์ที่เกี่ยวข้องหลายโพสต์ แต่ดูเหมือนว่าแต่ละโพสต์จะระบุว่าคุณต้อง:
- ดู
[[UIScreen mainScreen] bounds]
เพื่อให้ได้ขนาด
- ตรวจสอบว่าคุณอยู่ในแนวไหนและ
- บัญชีสำหรับความสูงของแถบสถานะ (ถ้าแสดง)
ลิงค์
รหัสการทำงาน
ฉันมักจะไม่ไปไกลขนาดนี้ แต่คุณทำให้ฉันสนใจ รหัสต่อไปนี้ควรทำเคล็ดลับ ฉันเขียนหมวดหมู่ใน UIApplication ฉันจะเพิ่มวิธีการเรียนการรับ currentSize หรือขนาดในแนวรับซึ่งเป็นสิ่งที่คุณจะเรียกใน willRotateToInterfaceOrientation:duration:
UIViewController
@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
ในการใช้รหัสโทร[UIApplication currentSize]
. นอกจากนี้ฉันรันโค้ดด้านบนดังนั้นฉันจึงรู้ว่ามันใช้งานได้และรายงานกลับคำตอบที่ถูกต้องในทุกทิศทาง โปรดทราบว่าฉันแยกตัวประกอบในแถบสถานะ ที่น่าสนใจคือฉันต้องลบ MIN ของความสูงและความกว้างของแถบสถานะ
หวังว่านี่จะช่วยได้ : ง
ความคิดอื่น ๆ
คุณสามารถรับมิติข้อมูลได้โดยดูที่rootViewController
คุณสมบัติของ UIWindow ฉันเคยดูสิ่งนี้ในอดีตและรายงานในทำนองเดียวกันว่ามีขนาดเดียวกันทั้งในแนวตั้งและแนวนอนยกเว้นจะรายงานว่ามีการแปลงแบบหมุนเวียน:
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] ดู]
<UILayoutContainerView: 0xf7296f0; เฟรม = (0 0; 320 480); แปลงร่าง = [0, -1, 1, 0, 0, 0]; ปรับขนาดอัตโนมัติ = W + H; เลเยอร์ = <CALayer: 0xf729b80 >>
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] ดู]
<UILayoutContainerView: 0xf7296f0; เฟรม = (0 0; 320 480); ปรับขนาดอัตโนมัติ = W + H; เลเยอร์ = <CALayer: 0xf729b80 >>
ไม่แน่ใจว่าแอปของคุณทำงานอย่างไร แต่หากคุณไม่ได้ใช้ตัวควบคุมการนำทางบางประเภทคุณอาจมี UIView ภายใต้มุมมองหลักของคุณโดยมีความสูง / ความกว้างสูงสุดของพาเรนต์และขยาย / ย่อขนาดพร้อมพาเรนต์ จากนั้นคุณสามารถทำได้: [[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]
. มันดูค่อนข้างรุนแรงในบรรทัดเดียว แต่คุณเข้าใจแล้ว
อย่างไรก็ตาม ... มันจะดีกว่าถ้าทำ 3 ขั้นตอนข้างต้นภายใต้บทสรุป เริ่มยุ่งกับ UIWindows แล้วคุณจะพบสิ่งแปลก ๆ เช่นการแสดง UIAlertView จะเปลี่ยนคีย์วินโดว์ของ UIApplication ให้ชี้ไปที่ UIWindow ใหม่ที่ UIAlertView สร้างขึ้น ใครจะรู้? ฉันทำหลังจากพบข้อผิดพลาดที่อาศัย keyWindow และพบว่ามันเปลี่ยนไปอย่างนั้น!