2013-06-06 89 views
1

我只是第一次嘗試在筆尖中使用Autolayout。看起來我的情況是教科書情況,其中NSLayoutConstraints將是完美的解決方案。對隱藏對象的NSLayoutConstraint仍然覆蓋替代約束條件

我有一個UITableviewCellUILabel和旁邊的圖像。圖像根據下層數據的屬性而變化,它可以改變大小,有時可以隱藏。我的意圖是標籤與圖像保持一定的距離,並在圖像隱藏時覆蓋整個單元格。

我在標籤上相應地設置的約束:

  • 一個與後緣從該圖像,高優先級的,但不是必需的前緣的一組距離約束。
  • 一個約束與後沿設置距離超視圖邊緣,優先級低得多。
  • 適當的左和上限制,對標籤的寬度沒有限制。

即使圖像被隱藏,標籤仍會被第一個約束縮短。這是預期的行爲?我通常會在運行時計算並更改標籤的寬度,但這看起來正是NSLayoutConstraints的意義所在。

如何在圖像不可見時忽略對圖像的約束?

+0

我相信第一個約束仍然會發生,因爲它比第二個約束具有更高的優先級。當圖像隱藏時,您需要刪除第一個約束。 –

+0

我認爲有一個程序化的解決方案,我發現一些其他線程的可能性。在我犯罪之前,我想確保我不會錯過簡單的事情。看來這將是一個簡單的情況,NSLayoutConstraints不需要編碼「幫助」。感謝您的建議,我現在正在嘗試其中一些選項。 –

+0

@verbumdei你讓我走上正軌。我爲圖像添加了一個約束出口。我首先嚐試改變優先順序,但沒有任何效果。然後,如您所建議的那樣,將其移除並適當添加回去。相當簡單。如果你以答案的形式發佈了一些細節,那麼我會給你信任。 –

回答

8

從NSLayoutConstraint的類引用中,一旦約束被放置,就不允許更改約束的優先級。而較高優先級的約束將總是覆蓋較低的約束。

該約束可以被刪除並添加回來。如果通過故事板或IB提供約束,則可以製作NSLayoutConstraint的IBOutlet並將其連接。

如果您使用Xcode功能自動生成IBOutlet的代碼行,它將聲明IBOutlet爲弱。如果您在將來刪除某個約束時將要添加約束,則需要將其更改爲較強。這是爲了避免刪除後釋放的約束。

然後,您可以刪除第一個約束,如果圖像被隱藏,第二個約束將發生。

[self.view removeConstraint:self.firstConstraint]; 

您可能需要在刪除約束後調用layoutIfNeeded。

+0

釘住了它。我實際上並不需要調用setNeedsLayout,可能是因爲我在更改圖像屬性之前更改了約束條件。 +1弱/強提示。我發現那很難。 –

+0

@deandavids是的,我上次發現它很困難。約束沒有被加回,因爲它是零。剛剛檢查了我的代碼。修改約束後我調用了layoutIfNeeded。剛剛更新了我的答案。 –

+0

稍作修改。除非從NSLayoutPriorityRequired更改爲更低或從任何值更改爲NSLayoutPriorityRequired,否則允許更改約束的優先級。 – Dalzhim

5

隨着IOS 8,則可以激活/停用一個約束(https://developer.apple.com/library/ios/releasenotes/General/iOS80APIDiffs/frameworks/UIKit.html):

我想創建2個約束,一個具有較低優先級,和隱藏視圖時,並且當重新激活它停用較高優先級一個視圖再次可見:

[self.firstConstraint setActive:NO];

+0

同意。實際上現在有很多新的方法可以實現這一點,包括課堂大小和故事板。今後的例行公事無法找到。加1爲更新的方法。 –

+0

iOS 7需要什麼? – kevinl