2014-09-11 45 views
10

我在iOS 8上遇到VFL約束問題,而在6和7上,這一切都可以。這是約束:iOS 8自動佈局,VFL和保證金等於或大於

H:|-margin-[_imageView]-(=>margin)-[_label]-margin-| 

兩個_imageView__label得到他們正確的固有寬度和幅度的增長預期。我想實現

|-[_imageView]-------------------------------[some text]-| 

|-[_imageView]---------------------------[a larger text]-| 

|-[_imageView]-----------------------[a very large text]-| 

|-[_imageView]-[a very very very very very very larg...]-| 

這是正常視覺,但它提出了一個破碎的約束例外:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7b856ee0 H:[UIImageView:0x7b8ef1f0]-(>=12)-[UILabel:0x7b8e7c60'Test']> 

有印刷_autolayoutTrace後無歧義。

但是,如果約束只涉及標籤有沒有問題:

H:|-margin-[_label1]-(=>margin)-[_label2]-margin-| 

問題可能之後的下一個步驟來解決:

改變約束消除>=和增加重點:

H:|-margin-[_imageView]-([email protected])-[_label]-margin-| 

設置擁抱優先級_imageView

[_imageView setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal]; 

設置的_label

[_label setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; 

有了這些規則的抗壓性有任何平臺上沒有問題。所有這些都需要iOS 8嗎?這是一個錯誤還是我做錯了?

謝謝。

+0

我的猜測是破碎的約束來自有太長的文本字符串來兌現「> = 12」;即邊距+圖像+文本的寬度超過了父視圖的寬度。確實,iOS 8引入了佈局邊距,但我對VFL語句如何受到任何幫助的影響還不夠了解。您可以將標籤的行高設置爲0,以便它可以垂直擴展並仍然保持水平約束? – NRitH 2014-09-26 05:07:47

+0

@NRitH無論文本的長度如何,約束總是被打破。我無法更改標籤的行數,文本必須被截斷。 – emenegro 2014-09-26 06:37:14

+0

你可以發佈一個完整的日誌和一個堆棧跟蹤,當它抱怨破碎的約束?如果您不設置內容擁抱優先級和標籤的抗壓縮性會發生什麼? – 2014-09-29 10:23:59

回答

5

我開始從頭項目,這裏是我的代碼(這實際上正常工作):

UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)]; 
topView.backgroundColor = [UIColor redColor]; 
topView.translatesAutoresizingMaskIntoConstraints = NO; 

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 40, 160)]; 
imageView.backgroundColor = [UIColor greenColor]; 
imageView.translatesAutoresizingMaskIntoConstraints = NO; 
[topView addSubview:imageView]; 

self.label = [[UILabel alloc] initWithFrame:CGRectMake(80, 80, 200, 32)]; 
self.label.backgroundColor = [UIColor yellowColor]; 
self.label.text = @"some text"; 
self.label.translatesAutoresizingMaskIntoConstraints = NO; 
[topView addSubview:self.label]; 


self.tableView.tableHeaderView = topView; 

NSDictionary *views = @{@"imageView":imageView, @"label":self.label}; 

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-margin-[imageView(40)]-(>=margin)-[label]-margin-|" options:0 metrics:@{@"margin": @30} views:views]; 
NSArray *imageConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[imageView(160)]-20-|" options:0 metrics:nil views:views]; 
NSArray *textConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[label]" options:0 metrics:nil views:views]; 
NSArray *topConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[topView(320)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(topView)]; 

[topView addConstraints:constraints]; 
[topView addConstraints:imageConstraints]; 
[topView addConstraints:textConstraints]; 
[topView addConstraints:topConstraints]; 

我覺得你的主要問題是,你不要關閉translatesAutoresizingMaskIntoConstraints產生UIView-Encapsulated-Layout(我在iOs8之前從未見過)。我還沒有找到一個有文件記載的地方,但有關於這個限制的問題有很多。

我還創建了GitHub庫,所以你可以嘗試一下自己:https://github.com/Nikita2k/constraintsTest

此外,還可以看看WWDC2014視頻 - 什麼表的新集合視圖(〜20分鐘)。有一些信息,你現在可以看到UIView-Encapsulated-Layout問題,但稍後會修復。此外,您還可以嘗試從故事板與rowHeight所有iOS8上tableViews打(或廈門國際銀行)應明確設定

self.tableView.rowHeight = UITableViewAutomaticDimension 

我不知道,它會在這個particullar情況下幫助或沒有,但給它一個嘗試太!