创建约束以在视图中居中标签

Posted

技术标签:

【中文标题】创建约束以在视图中居中标签【英文标题】:Creating constraint to center label in view 【发布时间】:2014-06-05 22:51:23 【问题描述】:

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

UIView - 圆形视图 UILabel - label1 UILabel - label2

circleview 显示在容器顶部 (0,0,width,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 视图。

【问题讨论】:

【参考方案1】:

这应该相对简单——它有助于使用 xib 查看您实际需要多少约束才能获得所需的效果。将一个标签约束在另一个视图的中心,这两个视图都在一个父视图中,只需要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 中居中。您遇到的任何问题都可能是由于未正确指定视图之间的其他约束。

【讨论】:

【参考方案2】:

你可以试试这个吗?

[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

【讨论】:

【参考方案3】:

With Masonry library

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

【讨论】:

以上是关于创建约束以在视图中居中标签的主要内容,如果未能解决你的问题,请参考以下文章

无法使用约束在视图中居中/正确缩放按钮和标签?

在其他两个之间垂直居中视图

Snapkit centerY 约束将项目居中于中心 Y 轴上方

故事板标签约束

自动布局动画保持 UILabel 居中

iOS - 添加约束后无法识别触摸