2012-08-17 88 views
2

我在使用iOS5和Storyboards嘗試以編程方式調整在UIViewController內託管的UITableView的高度時出現問題。 VC顯示主/細節記錄樣式,UITableView顯示詳細記錄。根據顯示的主記錄的類型,屏幕底部可能需要一組按鈕。如果按鈕不需要,那麼我想讓UITableView擴展它的高度以利用可用空間。我使用下面的代碼:iOS - 以編程方式調整UITableView高度的大小

CGRect tableFrame = [tableListView frame]; 
if (blnApprovalRec == YES) 
    tableFrame.size.height = 127; 
else 
    tableFrame.size.height = 170; 
[tableListView setFrame:tableFrame]; 

該代碼被稱爲每當主記錄變化,包括在viewDidLoad當屏幕首次加載。問題是,當VC加載時,UITableView不使用指定的大小繪製 - 它只是使用IB的默認大小繪製。一旦用戶更改主記錄,以便重新加載表格,則一切正常,尺寸根據需要更改。我試過使用setNeedsDisplaysetNeedsLayoutreloadData強制重繪,但沒有一個能夠工作。

+0

在哪種方法你打上面的代碼? – 2012-08-17 09:37:04

+0

該代碼是否放置在像viewDidLoad這樣的方法中? – Rick 2012-08-17 09:37:07

回答

11

的問題是,當VC負載,UITableView的不畫使用尺寸指定

出現這種情況,表視圖加載時,但它的UI是沒有得到刷新。請驗證您是否已在viewDidLoad或viewWillAppear中強制調用。

希望您的驗證碼是在單獨的方法:

CGRect tableFrame = [tableListView frame]; 
if (blnApprovalRec == YES) 
    tableFrame.size.height = 127; 
else 
    tableFrame.size.height = 170; 
[tableListView setFrame:tableFrame]; 

當視圖出現最初,您可能必須從主記錄的默認選定值。 您可以在viewWillAppear的調用函數中設置該值/實例。

你可以顯示方法名稱和代碼,你如何強制地在代碼片段上面調用?

+0

非常感謝Ankit,我在調用viewDidLoad中的代碼,我想這意味着控件尚未完全加載。我將代碼移到了viewWillAppear,現在所有的代碼都可以工作:-)。 – 2012-08-17 10:06:35

2

這是棘手的,它很難調整這樣的動態。

我會嘗試「setNeedsLayout」和「setNeedsDisplay」爲您的表,並在屏幕上強制重繪。

除此之外,我會故事板的最小尺寸,並使用代碼來擴大它。

通常,蘋果不喜歡我們這樣做,你的按鈕應該繪製在另一個視圖內的視圖頂部,如果可能的話。

對不起,我不能更精確,但我已經解決了所有這些問題,通過亂搞和黑客,放棄調整大小和重新設計。請讓我知道你怎麼去雖然:)

+0

不確定爲什麼動態調整視圖大小「很棘手」?蘋果在哪裏說他們不希望開發人員調整視圖大小?你爲什麼要在桌面上繪製按鈕? – 2012-08-17 09:45:36

+0

那麼,你正在關注文檔並使用setFrame不是嗎?我的意思是,在文檔動態調整大小後,下面的文檔還不適合我。在其他視圖頂部繪製視圖是我在過去將模式按鈕嵌入到桌面視圖中的方式。但真正的解決方案是使用導航和標籤欄控制器以及桌面視圖 - 我必須這樣做才能避免動態調整大小和移動事物。 – FaddishWorm 2012-08-17 09:50:04

1

請確保您設置表後加載框架。

你在哪個方法中調用該代碼?

5

您可以以編程方式調整UITableView的大小,但是您也需要以編程方式創建UITableView。不要使用Storyboard。

+0

是的,據我瞭解,這是正確的。您必須以編程方式創建表格視圖來調整其大小。 – Veeru 2013-12-10 06:02:08

+0

這是正確的答案。令人震驚的是,你仍然無法在Xcode 6.3的故事板上做到這一點 – 2015-06-29 22:28:56

4

我有同樣的問題,只是需要從

- (void) viewDidLoad 

的代碼移到

- (void)viewDidAppear:(BOOL)animated 
相關問題