2011-09-07 37 views
2

考慮下面的應用程序的委託切入點:爲什麼窗口的子視圖最初定位錯誤,但在旋轉後正確重新定位?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 

    // Custom view controller 
    main = [[MainView alloc] initWithNibName:@"MainView" bundle:nil]; 
    [self.window addSubview:main.view]; 

    return YES; 
} 

一切都是蘋果公司的股票代碼,除了「自定義視圖控制器」的一部分。在那裏,一個自定義的視圖控制器被抓取,並有效地添加爲應用程序的主視圖。

問題:視圖中的小部件的位置應高出20px。換句話說,視圖內容的前20像素被狀態欄遮擋。

但是:旋轉後,視圖及其內容被正確定位,並且狀態欄重疊不再出現。

這是怎麼回事?具體來說,當最初將子視圖添加到窗口時,確保事物定位正確的模式/最佳實踐是什麼?

回答

4

您正在使用錯誤的方法來初始化UIWindow的框架。 Yous應該使用[[UIScreen mainScreen] applicationFrame]正是因爲你談論的原因。 Read this更多(基本上applicationFrame負責處理狀態欄問題)。

+1

這不完全正確,但它使我到正確的地方。改變self.window座標給了我更多的旋轉後的錯誤,但我通過添加這個來修正所有的問題:'main.view.frame = [[UIScreen mainScreen] applicationFrame];' – Jaanus

1

我想因爲您已經使用initWithFrame:[[UIScreen mainScreen] bounds]來初始化框架(height-480),然後添加子視圖,當應用程序啓動時,它會佔用整個屏幕(如您所要求的那樣)。但是當你旋轉它時,框架會考慮到狀態欄來調整大小。這就是爲什麼問題只發生一次,即第一次。看看這個sof問題:UIViewAutoresizingNone: Resize after rotation

要確保最初添加子視圖窗口時,事情是正確定位也,你可以將其添加爲subView之前確定其frame大小和origin