在视图中为中心标签创建约束

时间:2014-06-05 22:51:24

标签: ios objective-c uiview autolayout nslayoutconstraint

我正在尝试以编程方式设置一些约束。我有一个容器视图UIView,它包含三个子视图。

UIView - circleView
UILabel - label1
UILabel - label2

圆视图显示在容器顶部(0,0,宽度,80)。 label1显示在圆视图下方,带有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视图。

3 个答案:

答案 0 :(得分:2)

这应该是相对简单的 - 它有助于使用xib来查看实际需要多少约束来获得所需的效果。将标签约束在另一个视图的中心(两者都在parentView中),只需要完全约束2个约束。如果这是一个常规的UIView,你需要4个约束(x,y,width,height),但标签会自动从它的内容中确定它的宽度和高度,所以它不含糊。当然,如果您对其他视图进行了适当的约束,但您只是在圆形视图中询问了label2。

我更喜欢使用非可视形式来定义约束,因为它们读起来像数学方程式。你想要的是:

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

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

由于这些是具有公共父级的兄弟,因此约束将添加到parentView。所以你得到以下两个约束。

[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 :(得分: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

答案 2 :(得分:0)

With Masonry library

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.center.equalTo(view);
}];