2014-06-05 46 views
0

我想編程設置一些約束。我有一個容器視圖UIView,其中包含三個子視圖。創建約束中心標籤的視圖

的UIView - circleView
的UILabel - label1的
的UILabel - LABEL2

的circleview示出在容器的頂部以(0,0,寬度,80)。 label1顯示在circleview下面,並有5.0填充。

我現在試圖將label2添加到circleView的中心。如何以編程方式使用AutoLayout執行此操作。

這就是我目前所做的。

NSDictionary *views = NSDictionaryOfVariableBindings(circleView,labelView, iconLbl); 

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[circleView(circleSize)]|" options:0 metrics:metrics views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[labelView]|" options:0 metrics:metrics views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[circleView(circleSize)]-(padding)-[labelView]-|" options:0 metrics:metrics views:views]]; 

label2是字典中的iconLbl視圖。

回答

2

這應該是相對簡單的 - 它有助於使用xib來查看實際需要多少約束來獲得所需的效果。將一個標籤約束在另一個視圖的中心,這兩個視圖都位於父視圖中,只需要2個約束即可完全約束。如果這是一個普通的UIView,你需要4個約束(x,y,width,height),但標籤會自動從它的內容中確定它的寬度和高度,所以它不是不明確的。當然,如果其他視圖都受到了適當的限制,但您只會在圓形視圖中詢問label2。

我更喜歡使用非視覺形式來定義約束,因爲它們像數學方程一樣讀取。你想要的是:

label2.centerX = circleView.centerX * 1 + 0;

label2.centerY = circleView.centerY * 1 + 0;

因爲這些是具有共同父代的兄弟姐妹,所以約束被添加到父視圖。所以你得到以下兩個約束。

[parentView addConstraint:[NSLayoutConstraint constraintWithItem:label2 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:circleView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; 

[parentView addConstraint:[NSLayoutConstraint constraintWithItem:label2 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:circleView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]]; 

這足以讓label2居中在parentView中。你得到的任何問題都可能是由於你的視圖之間的其他約束沒有被正確指定。

1

你可以試試嗎?

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[circleView(circleSize)]" options:0 metrics:metrics views:views]];  //Dont link to both the sides. Dock to the left edge 

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self. labelView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0 ]]; //Specify the X 

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self. labelView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0 ]]; //Specify Y 

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[circleView(circleSize)]" options:0 metrics:metrics views:views]]; //Dock the circle to the top