2009-08-31 40 views
15

我有一個視圖加載在MainWindow.xib中。它只是一個帶有全景視圖的視圖,在整個屏幕上顯示圖像(320 X 480)。當應用程序加載時我顯示此視圖,然後我做了IPhone - UIView addSubview頂部差距

[self.view addSubview:tabbarController.view]; 

標籤欄控制器是隻是添加到它2個視圖控制器一個的UITabBarController。當它將tabbarController的視圖添加到子視圖中時,它會在大約20px的頂部留下空隙。我的應用程序確實有一個狀態欄,但這基本上是另一個空間。除非我將此添加到我的視圖控制器,否則會發生這種情況:

self.view.frame = CGRectMake(0, 0, 320, 480); 

任何人都可以解釋這一點。我在做

self.view = tabbarController.view; 

但被告知我不應該那樣做。所以,現在我添加一個子視圖,但我不明白爲什麼我必須調整我的視圖的CGRect不顯示20px。

回答

17

UITabBarController希望將其視圖添加爲UIWindow的子視圖,而不是其他某個UIView的子視圖。 frame屬性定義了視圖在其超級視圖中的偏移量,所以UITabBarController實現默認將其視圖的框架偏移20像素,以爲狀態欄留出空間。您以非標準方式使用UITabBarController,方法是將其添加到狀態欄已被偏移20像素的視圖中。 UITabBarController將其視圖相對於其超視圖偏移另外20個像素,導致您看到的空白。

一個乾淨的方式來解決這個問題是添加的UITabBarController的視圖窗口,而不是一個視圖的子視圖:

[[[UIApplication sharedApplication] keyWindow] addSubview:tabbarController.view]; 

(注:keyWindow方法僅僅返回你的窗口,如果你已經叫makeKeyAndVisible。否則,你可能想在你的UIViewController上設置一個窗口屬性。)

+0

感謝您的明確解釋。也許我應該回去重組我的應用程序的一部分。我想以正確的方式做事,但我認爲將視圖控制器邏輯與應用程序委託分開可能會更好 - 所以我的根視圖控制器可以完成它所需的一切。這將解釋爲什麼在我的根視圖控制器,如果我做self.view = tabbarController.view而不是作爲子視圖添加,我不會得到的差距。很好的答案。如果可以的話,我會投更多。 – Brian

+0

聽起來你的直覺在這裏很好。這只是Cocoa Touch中那些設計限制中的一個,我們現在必須解決。 請記住,您不一定需要將tabbarController.view添加到您的應用程序委託的窗口中。你可以將它添加到你的視圖控制器中,如果這是你認爲最有意義的地方。您只需要通過keyWindow方法訪問窗口對象,或者在applicationDidFinishLaunching:中將其設置爲控制器上的屬性。 – cduhn

+0

但這並不意味着tabbarcontroller.view現在是window.view的子視圖? 但在我的情況下,我有一個廣告視圖,然後是第二個contentview,這是不正確的。我將tabbarcontroller.view添加到contentview。以這種方式,視圖控制器將根據廣告處理內容/廣告。如果我將tabbarcontroller.view添加到窗口,我不認爲我將能夠使用我的viewcontroller處理視圖。你怎麼看? – LolaRun