2013-10-04 57 views
1

有這個問題已經有幾個問題,但沒有一個滿意的答案。我想知道爲什麼框架和邊界看起來是錯誤的,使用最簡單的可能的例子,並且有人告訴我什麼是正確的方法來處理它...UIViewController/UIView方向框/界限在風景只有應用程序

我使單一視圖應用程序,沒有故事板,我只勾選景觀支持。然後在didFinishLaunching方法:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    ViewController *vc = [[ViewController alloc] init]; 
    self.window.rootViewController = vc; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

,並在視圖控制器:


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor redColor]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSLog(@"%.1f,%.1f",self.view.frame.size.width,self.view.frame.size.height); 
} 

則輸出768.0,1024.0 - 這顯然是錯誤的,即使紅色充滿了景觀尺寸屏幕。所以我不能依靠self.view.frame或self.view.bounds來排列或調整子視圖的大小。

什麼是最新的「適當的」方法來避免這樣的問題? (沒有使用筆尖或故事板,也沒有hacky交換寬度和高度)

+0

試試這個的NSLog(@ 「%@」,self.view);它會給yiu框架 – Purva

+1

它不是nslog的問題,記錄整個視圖對象確認了同樣的問題:> – jonydep

回答

0

不知道這是否正確,但這是我最好的猜測,我現在無法測試。如果我沒有錯,默認方向是任何應用程序的縱向。所以,爲了支持不同的方向,你的應用程序應該實現自動旋轉方法(根據你構建的iOS版本有所不同)。因此,即使您的應用程序被勾選爲僅支持橫向模式,它也不會實際旋轉。嘗試執行指定的方法,讓我知道如何去...

爲iOS 5和更早版本,你應該使用:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
{ 
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
{ 
return YES; 
} 

return NO; 
} 

適用於iOS 6,以後你應該使用:

-(NSUInteger)supportedInterfaceOrientations 
{ 
return UIInterfaceOrientationMaskLandscape; 
} 

-(BOOL)shouldAutorotate 
{ 
return YES; 
} 

如果在旋轉發生後檢查視圖的框架,它應該是好的。

編輯:

看看this SO question和它的答案。他們提供了一些很好的解決方法。此外,鑑於在應用程序中,您將主要將視圖控制器嵌入到導航控制器或選項卡欄控制器中,或者甚至兩者中,您可以繼續並在其上創建子類別以確保將所有內容都轉發給您的視圖控制器。

另一個great answer解釋了實際發生的事情。

+0

didRotateFromInterfaceOrientation似乎並沒有被調用,所以我不知道如何檢查後旋轉。順便說一句,我認爲你的supportInterfaceOrientations返回值應該是UIInterfaceOrientationMaskLandscape – jonydep

+0

@jonydep它確實被調用。我自己測試了一下。是的,你使用UIInterfaceOrientationMaskLandscape是正確的。另請參閱更新 –

0

您正在檢查幀和邊界的大小太快。

相反,檢查它們旋轉後:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    NSLog(@"Bounds %@", NSStringFromCGRect(self.view.bounds)); 
    NSLog(@"Frame %@", NSStringFromCGRect(self.view.frame)); 
} 
+0

這看起來似乎是文檔中建議的內容,但是根本沒有調用RotateFromInterfaceOrientation。 – jonydep

相關問題