2015-04-14 44 views
3

我想將下面的約束設置爲我的浮動視圖之一。NSLayoutconstraint破損自xcode 6.3

leftConstraint = [NSLayoutConstraint constraintWithItem:detailView 
attribute:NSLayoutAttributeLeft 
relatedBy:NSLayoutRelationEqual toItem:nil 
attribute:NSLayoutAttributeNotAnAttribute 
multiplier:0.0 
constant:VIEW_WIDTH]; 

該視圖將水平移動並具有固定寬度。我不能將這個觀點固定在其他觀點上。我將改變約束中的常量值,將其移到我的視圖上。

當我在XCode 6.3中運行上述約束時,出現以下錯誤。 「 」0或零次乘數與第一個屬性的位置一起創建的位置等於常數的非法約束「

我不確定爲什麼會創建非法約束。

爲了繞過這個問題,我使用了0.001乘法器,但那不適用於所有情況。所以尋找一個更好的解決方法來滿足這個要求。

回答

4

這是公式自動佈局用途:

item1.attribute1 = multiplier × item2.attribute2 + constant 

所以,如果你乘數設置爲0或不具有ITEM2,ATTRIBUTE1將constant。這不是一個好主意,因爲這是對超級視圖的一個限制而沒有提到超級視圖。在大多數情況下,這是代碼錯誤的結果。所以蘋果決定創建這種限制是非法的。

沒有第二項的約束對除高度和寬度以外的所有屬性均無效。

實際上,您應該明確地添加您的約束關於視圖的超視圖。

你的約束應該是這樣的

leftConstraint = [NSLayoutConstraint constraintWithItem:detailView 
        attribute: NSLayoutAttributeLeft 
        relatedBy: NSLayoutRelationEqual 
        toItem:  detailView.superview 
        attribute: NSLayoutAttributeLeft 
        multiplier: 1 
        constant: VIEW_WIDTH]; 
0

如果你想定位視圖向左並添加寬度約束,你必須使用兩個約束:

CGFloat leftConstraintConstant = 40.0f; 
CGFloat VIEW_WIDTH = 200.0f; 

NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:detailView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:leftConstraintConstant]; 
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:detailView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:VIEW_WIDTH]; 

[self.view addSubview:detailView]; 
[self.view addConstraints:@[leftConstraint,widthConstraint]]; 

正確放置您的你也應該爲Y軸的位置和高度添加單獨的約束。 請注意,我沒有測試過這個代碼,但它應該讓你簡要了解需要做什麼。