2010-11-09 80 views
9

我有一個基於導航的應用程序,我將自定義視圖放置在導航視圖中。首先,我想知道如何獲得「導航視圖」的框架,以便我可以正確放置自定義視圖。
此外,我有時會隱藏導航欄,並希望確保正確獲取框架信息。 (不與[[UIScreen mainScreen]邊界])以設置爲超視圖框架的框架以編程方式創建視圖?

其次,一般來說,如何訪問超級視圖的框架,以便我可以相應放置視圖?
我試過以下沒有成功。

-(void) loadView { 
[super loadView]; 
UIView* myView = [[UIView alloc] initWithFrame: CGRectZero]; 
self.view = myView; 
self.view.frame = self.view.superview.frame; 
[myView release]; 
} 

或在layoutSubviews中設置框架,但發現layoutSubviews沒有被調用。我想這是因爲我在這個視圖中沒有任何子視圖?

謝謝

CNC中

與給出的答案,現在我知道我需要設置view.frame到上海華的邊界。
問題是,我無法訪問viewDidLoad內的超級查看。
我可以看到superview在viewWillAppear中正確設置,但不在viewDidLoad中。

我發現viewDidLoad中被調用在不同的時間,在由推pushViewController或訪問self.view
我有以下代碼和viewDidLoad中被從零稱爲== controller.view.superview如。

if (nil == controller.view.superview) { 
    CGRect frame = scrollView.frame; 
    frame.origin.x = frame.size.width * page; 
    frame.origin.y = 0; 
    controller.view.frame = frame; 
    [scrollView addSubview:controller.view]; 
} 

既然不能從viewDidLoad中訪問上海華,我不能,因爲我以前在viewDidLoad中做佈局視圖。這似乎很不方便,也不必要的複雜。
有什麼建議嗎?

+0

您需要閱讀iOS中的視圖層次結構。 – Tirth 2010-11-09 05:53:42

+0

贊成,谷歌搜索它。 – eugene 2010-11-09 06:04:46

回答

10

superview屬性是零,直到你的觀點是什麼地方添加爲子視圖。一般來說,你無法知道loadView方法中的超級視角。

您可以按照Costique的建議使用自動調整屬性。檢查出調整子視圖the official UIView docs

您還可以設置呼叫loadView後的幀,例如在這樣的事情:

MyViewController *myController = [[MyViewController alloc] init]; 
myController.view.frame = window.bounds; 
[window addSubview:myController.view]; 

順便說一句,這是通常使用更安全父的bounds屬性爲子視圖的框架。這是因爲父級界限與子視圖的框架位於同一座標系中,但父級框架可能不同。例如:

UIView *parentView = /* set up this view */; 
UIView *subView = /* set up subview */; 
[parentView addSubview:subView]; 
parentView.frame = CGRectMake(30, 50, 10, 10); 
subView.frame = subView.superview.frame; // BAD!!! 
// Right now subView's offset is (30, 50) within parentView. 
subView.frame = subView.superview.bounds; // Better. 
// Now subView is in the same position/size as its parent. 
+0

謝謝,我想我可以做self.view.frame = self.view.superview.bounds;在我的viewDidLoad()中。但我注意到我在loadView中創建了我的視圖,但實際上我沒有通過addSubview或其他方法將它添加到超級視圖中。所以代碼不會做任何事情。奇怪的是,我之前能夠看到該視圖而沒有將其添加到父視圖中。如何將我的視圖(在loadView中創建)添加到父視圖中? – eugene 2010-11-09 06:30:56

+0

對不起,我搞砸了閱讀我自己的代碼。我想這是在做UINavigationController的initWithRootViewController時添加的 – eugene 2010-11-09 06:56:09

7

只需設定自動尺寸面罩和導航控制器將做休息:

myView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 
+0

啊謝謝,它會正常工作,我猜。但我有一個滾動視圖作爲myView之一。設置autoresizingMask滾動視圖不會工作,我想? – eugene 2010-11-09 06:04:26

+0

爲什麼不呢? UIScrollView只是一個專門的UIView,它操縱滾動的邊界源。我做的唯一不同的是我用[UIScreen mainScreen] .applicationFrame而不是CGRectZero初始化UIViews,但我認爲它根本不重要。 – Costique 2010-11-09 07:35:32

+0

我試過了你的建議。但在我的viewDidLoad(),[self.view界限](佈局子視圖)返回(0,0,0,0)。我在某個地方搞砸了嗎?你在viewDidLoad裏面得到了正確的[self.view bounds]嗎? – eugene 2010-11-09 12:11:20

相關問題