2015-02-11 64 views
3

在視覺格式化語言中是否有一種方法可以將兩個元素保持在同一個座標軸上的相同位置?在視覺格式化語言中給視圖相同的位置

例如我有一個UILabel和一個UITextField,我想要水平相互並排。在佈置垂直約束時,是否有指定這個?

像這樣的理想:

|-40-([label][field])-10-[otherStuff] 

...其中[label][field]都具有相同的Y位置,但是從上海華盈的前40分的情況下和10分之下他們是[otherStuff]

這可能嗎?

或者我應該將[label][field]嵌套在他們自己的UIView中,然後解決這個問題嗎?

回答

2

視覺格式語言不支持這本身。首先,水平佈局和垂直佈局必須用兩個獨立的字符串來完成。但是+[NSLayoutConstraint constraintsWithVisualFormat:options:metrics:views:]需要包含對齊的選項。

所以,你可以使用:

NSDictionary* views = NSDictionaryOfVariableBindings(field, label); 
NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[label]-10-[otherStuff]" options:0 metrics:nil views:views]; 
[field.superview addConstraints:constraints]; 
constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[label][field]" options:NSLayoutFormatAlignAllBaseline metrics:nil views:views]; 
[field.superview addConstraints:constraints]; 

在第二種情況下,NSLayoutFormatAlignAllBaseline使得它,這樣,不僅field線索label,但他們在相同的垂直位置(根據其基線,這可能比對齊它們的中心,頂部或底部更好)。

+0

雖然這裏所有的答案都適合,但我最終使用了'NSLayoutFormatAlignAllBaseline'方法。非常感謝! – Jimmery 2015-02-12 10:48:11

+0

如果我想讓標籤具有特定的高度,我該怎麼辦?我應該[標籤(40)]還是[標籤(== 40)]或其他? – Honey 2017-01-12 21:12:56

1

想想這樣:如果你可以在Interface Builder中使用Autolay來完成,你也可以使用Visual Format Language。

然而,對於您提出的使用情況下,你必須描述多個語句的約束:

  1. 設置的field水平同一性和label
  2. 設定從40像素的垂直空間在上海華到字段的頂部和10像素到otherStuff

所有這一切需要整體是,對於每個子視圖中,必要的放置值的所有4(X,Y,寬度和h八)被明確定義。

我通過代碼實現Autolayout的一般方法是編寫一個自定義庫,其中包含的方法與Interface Builder中的各個約束相同。下面是一些示例方法簽名:

  1. +(void)addFixedHeightConstraintToView:(UIView*)view height:(CGFloat)height;
  2. +(void)addTopMarginFromSuperviewConstraintToView:(UIView*)view topMargin:(CGFloat)topMargin;
  3. +(void)addHorizontalSpaceConstraintFromView:(UIView*)fromView toView:(UIView*)toView horizontalSpace:(CGFloat)hSpace;

這些方法都非常簡單易懂VFL定義。一旦我有了這些,我可以輕鬆解決你描述的用例。下面是一些示例代碼:

[CustomAutoLayout addTopMarginFromSuperviewConstraintToView:field topMargin:40]; 
[CustomAutoLayout addTopMarginFromSuperviewConstraintToView:label topMargin:40]; 
[CustomAutoLayout addHorizontalSpaceConstraintFromView:field toView:label horizontalSpace:0]; 
[CustomAutoLayout addVerticalSpaceConstrantFromView:field toView:otherStuff verticalSpace:10]; 
1

我知道的唯一辦法是兩個用2視頻格式的聲明是這樣的:

|-40-[label]-10-[otherStuff] 
|-40-[field] 

不幸的是,這意味着複製的第一個語句的一部分。

嵌套到另一個視圖是一個解決方案。

您還可以添加代碼約束,而無需使用視覺格式的語言:

NSLayoutConstraint* fieldLeft = [NSLayoutConstraint constraintWithItem:field 
      attribute:NSLayoutConstraintAttributeLeading 
      relatedBy:NSLayoutRelationEqual 
      toItem:label 
      multiplier:1 constant:0]; 
[field.superview addConstraint:fieldLeft]; 
相關問題