创建约束以在视图中居中标签
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);
];
【讨论】:
以上是关于创建约束以在视图中居中标签的主要内容,如果未能解决你的问题,请参考以下文章