2014-10-30 74 views
24

我在iOS8上有自動佈局的問題,我可以重新創建的最簡單的情況是一個簡單的tableView。我設置了一個靜態單元,然後只需添加一個標籤。添加披露指標時ios8單元約束破解

我的目標是讓標籤在很大程度上填補了空間,所以我必須在標籤上三個約束...

  1. 中心垂直它在上海華內(我認爲這是好的)
  2. 套裝標籤後緣30(相對於上海華)
  3. 設置標籤導致保證金30(相對於上海華)

這一切都絕對沒問題,並沒有什麼大的問題或工作完美警告(它會警告零高度,但我不認爲這是太多的問題)

現在...如果我添加一個披露指標,它全部崩潰。它仍然看起來不錯,但我得到以下幾點:

2014-10-30 15:51:46.358 ContraintIssue[25572:1586028] Unable to simultaneously satisfy constraints. 
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
(1) look at each constraint and try to figure out which you don't expect; 
(2) find the code that added the unwanted constraint or constraints and fix it. 
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, 
refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fd3f3d23390 UITableViewCellContentView:0x7fd3f3d226f0.trailingMargin == UILabel:0x7fd3f3d227e0'Label'.trailing + 30>", 
    "<NSLayoutConstraint:0x7fd3f3d235f0 UILabel:0x7fd3f3d227e0'Label'.leading == UITableViewCellContentView:0x7fd3f3d226f0.leadingMargin + 30>", 
    "<NSLayoutConstraint:0x7fd3f53b73b0 'fittingSizeHTarget' H:[UITableViewCellContentView:0x7fd3f3d226f0(38)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fd3f3d23390 UITableViewCellContentView:0x7fd3f3d226f0.trailingMargin == UILabel:0x7fd3f3d227e0'Label'.trailing + 30> 

我不明白,爲什麼添加的指標會導致這樣的問題,這是沒有任何關係的數字規模,我已經試驗相當位。

任何想法?

真實世界的例子是一個單元,它有一個標籤(標籤),然後是另一個標籤或一個文本視圖,其中包含一個值,可以按照本發明進行設置。所以第一個標籤是一個固定大小,理想的第二個標籤需要是它的最大值,但如果需要的話截斷文本。

(見「鈴聲」或「震動設置」中增加了對我想要實現一個例子的接觸)

非常感謝,

利。

+0

我看到了同樣的問題。一切似乎都很好,但警告就在那裏。如果我刪除披露指標,一切正常。有這個運氣嗎? – DemonGyro 2015-01-05 22:15:46

+0

我有這個相同的問題,雖然我無法使用故事板來解決這個問題,但通過在代碼中定義我的UITableViewCell子類的佈局約束,我可以得到accessoryType的工作! – 2015-01-23 01:21:25

回答

43

我剛剛有同樣的問題。我想在左邊佈置一個圖像視圖,右邊有一個標籤,用於填充圖像視圖和超級視圖(這是單元格的內容視圖)的右邊(或尾部)邊框之間的空間。輔助視圖也設置爲披露指標。 在你的情況下,所有H型和一個我發現在日誌中發現衝突限制fittingSizeHTarget。我沒有發現這意味着什麼,以及這是從哪裏來的,但我在這裏找到了你的帖子。

以下的伎倆對我來說:

下你的標籤的尾隨到上海華約束的優先級。 (我選擇了990)。

我認爲,佈局系統(披露指標可見)無論如何不能滿足所有的約束,所以它打破了一個。但是,如果您降低優先級,它仍會嘗試滿足約束條件,但不會因爲衝突約束具有更高的優先級而破壞它。

希望這可以解決您的問題。

+0

爲我工作,謝謝 - 在Xcode中剔除了日誌輸出:) – SimonTheDiver 2015-03-03 10:04:51

+0

在我看來,這種情況遠比我應該的時間長。這個解決方案也適用於我。看起來像框架應該自己做的事情,因爲披露指標和所有隻是股票UIKit項目。 – vichudson1 2015-03-22 20:15:04

+0

降低標籤尾隨的優先級,它適用於我 – 2015-04-20 03:10:18

0

請注意斯蒂芬在upvoted回答評論部分說。upvoted的答案是有點正確,但重要的是要明白爲什麼它只應用於某些情況。

優先級通常用於上下文中,其中元素A有一個高度等於或小於/大於300的約束,而元素B有一個高度等於或小於/大於500.然後,自動佈局可以同時滿足兩個條件在其優先事項上。

在這個特定的例子中,兩個約束都被設置爲特定的值,並且降低優先級基本上告訴忽略該約束,如果它不可能滿足(沒有「部分地忽略它」)。 但是 UILabel有一個例外 - 默認的UILabel行爲是調整自己的大小以適應內容,除非它受到額外邊距的限制(autodesize約束隱藏在fittingSizeHTarget名稱下),並且此行爲有時會顯示虛假警告。實際上,這個約束在運行時會被忽略,但在內部禁用之前它會發出警告。因此,即使我們通過降低其優先級(我們將優先級設置爲900)來忽略其中一個約束,但由於autosize約束在運行時將被忽略,因此我們的優先級將被應用並滿足。