2013-04-18 52 views
0

我正在向UIViewController添加UIDatepicker,這是UINavigationController的rootview,我使用此代碼將Datepicker放置在屏幕的底部。子視圖位置不正確

UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 216, 320, 216)]; 
[self.view addSubview:picker]; 

這通常應該將拾取器準確地放置在屏幕的底部,但它是錯位的44p。導航欄正好是44p高度,所以我認爲這是問題,但我不知道爲什麼框架高度包含導航欄的高度,當它不像Subview時。

我知道一個簡單的方法是減去44,但我正在尋找一個沒有任何固定數字的解決方案。有沒有辦法實現它,有人可以解釋我爲什麼視圖包含導航欄的高度?

回答

1

設置導航欄的半透明屬性YES解決您的問題..

例如:

self.navigationControllerInstance.navigationBar.translucent = YES; 
+0

好的,這解決了問題,但我不知道爲什麼。 ;) – digga

+0

如果你不希望它是半透明的,但仍然希望沒有幻數的位置,該怎麼辦?似乎是一種副作用解決方案... – bryanmac

+0

@bryanmac - 如果您不想將半透明屬性設置爲YES,則需要將視圖控制器的視圖高度設置爲960(ipad即1004-44 portraite模式)。 iPhone也需要類似的計算。像這樣,您可以處理視圖的框架以達到要求。但是,可以肯定的是,半透明的財產是一個有效的解決方案,而不是設置視圖框架。 –

0

嗯,我認爲,因爲你的UIViewController是UINavigationController的根視圖,所以隱式地在其邊界上包含了navigationBar。

編程獲取它的框架,你可以使用:

CGRect navframe = [[self.navigationController navigationBar] frame];

0
UIDatePicker *picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height - 216, 320, 216)]; 
[self.view addSubview:picker]; 

試試這個吧!

+0

對不起,這給了我同樣的結果。設置導航欄transculent解決了它。不管怎麼說,多謝拉 ;) – digga

0

最好不要硬編碼任何維度。試試這個代碼:

UIDatePicker *picker = [[UIDatePicker alloc] init]; 
CGRect pickerFrame = CGRectMake(0, CGRectGetHeight(self.view.bounds) - CGRectGetHeight(picker.bounds), CGRectGetWidth(picker.bounds), CGRectGetHeight(picker.bounds)); 
[picker setFrame:pickerFrame]; 
[self.view addSubview:picker]; 

它的工作原理,並沒有假設datepickers高度始終是216這可能會在未來的iOS實現改變,所以最好是在運行時檢查大小。

0
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

我想這會解決您的問題!