2013-08-16 80 views
2

我一直在嘗試通過學習自動佈局來改進我的佈局技巧,但是我偶然發現了一個我只是無法解決的問題。自動佈局tableHeaderView

下面是發生了什麼:有一個視圖控制器,其中包含一個UITableView和一個UIView。這個視圖放在表格視圖的正下方,它的高度不會延伸到全屏高度(假設它佔據了它的上半部分)。

表視圖使用分組風格並放置在提到的視圖上方,具有半透明背景,因此您可以在其下方看到視圖的內容。由於視圖佔用了一半的屏幕,我需要在這個表視圖中添加一個tableHeaderView(也是半透明的),以便在第一次加載視圖控制器時,整個背景內容清晰可見。

這樣做的最終效果就像固定的tableHeaderView在向上滾動表格視圖時消失在背景上。

這是用一個簡單的方法使用彈簧和支柱來完成的,但每次我嘗試向表格視圖添加標題時,Auto Layout都會崩潰應用程序(不管我怎麼做)。

因爲我正在尋找一種方式來始終與後臺(奧瑟維尤)與tableHeaderView高度的觀點高度,我使用的是:

[self.view addConstraint:[NSLayoutConstraints constraintWithItem:headerView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:otherView attribute:NSLayoutAttributeHeight multiplier: 1 constant:0]]; 

(這是我的理解是,約束可以「T被直接添加到表視圖,因爲奧瑟維尤不是它的一個子)

也:

[headerView setTranslatesAutoResizingMaskIntoConstraints:NO] 

這些電話始終會導致此崩潰:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.' 

那麼有沒有辦法做到這一點?是否有可能使用自動佈局將tableHeaderView高度綁定到視圖上的另一個元素?

我還應該注意到,我早就離開了IB,所以這一切都是在代碼中完成的,特別是在loadView上。

回答

0

如果你犯了一個實例變量的NSLayoutConstraint並設置它像這樣:

headerViewHeightConstraint.constant = 1000.0f; 
[headerView updateConstraintsIfNeeded]; 

PS:

headerViewHeightConstraint = [NSLayoutConstraint constraintWithItem:headerView 
                  attribute:NSLayoutAttributeHeight 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                  attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0f 
                  constant:otherView.frame.size.height]; 

您可以通過調整它的大小記住,addConstraints:是與addConstraint:不一樣。

結合使用帶有約束的陣列或[NSLayoutConstraints constraintsWithVisualFormat:...]

addConstraint:結合使用具有單個約束這是上面的例子。

如果您優先於layoutSubviews:,請在第一行中致電[super layoutSubviews]。這迫使視圖及其子視圖進行佈局,以便您可以訪問其框架細節等。

+0

大衛,感謝您的意見。我對addConstraints/addConstraint混淆不清。這是我原來的問題上的一個錯字。我修好了。無論如何,根據你的建議:每當我調用[self.view addConstraint:headerViewHeightConstraint]時,仍然會發生同樣的崩潰;不要緊,如果我在loadView,layoutSubviews或其他方法上執行它。看來,對我來說,表格視圖實際上是在向任何子視圖添加約束。 –

+1

哦,你添加約束到tableView?那種感覺就像是一個不行。 –

+0

是的,那也是我的猜想。因爲這個評論,我接受你的答案。到目前爲止,不幸的是,使用Auto Layout使用UITableView子視圖似乎是不可能的。感謝您的幫助,David。 –