使用 NSLayoutConstraints 在 UITextView 中将 UILabel 居中

Posted

技术标签:

【中文标题】使用 NSLayoutConstraints 在 UITextView 中将 UILabel 居中【英文标题】:Centering a UILabel in a UITextView using NSLayoutConstraints 【发布时间】:2013-04-11 17:37:13 【问题描述】:

我正在尝试将 UILabel 添加到 UITextView 并将其置于 textView 顶部的中心。它不是居中,而是放在左侧。我怀疑这是因为标签的内在大小优先于约束尝试将其拉伸到整个视图。不知道如何解决这个问题。代码如下:

self.titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
self.titleLabel.textAlignment = NSTextAlignmentCenter;
self.titleLabel.text = @"Some text that should be centered in the textView";
[self addSubview:self.titleLabel];

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_titleLabel);

NSArray *hConstraint = 
   [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_titleLabel]-|"
                                               options:0 metrics:nil
                                                 views:viewsDictionary];
[self addConstraints:hConstraint];

NSArray *vConstraint = 
   [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(-50)-[_titleLabel]"
                                               options:0 metrics:nil
                                                 views:viewsDictionary];
[self addConstraints:vConstraint];

这是来自 iPad 模拟器的关于标签如何左对齐的 sn-p:

【问题讨论】:

【参考方案1】:

您不能使用constraintsWithVisualFormat 创建居中约束。您必须将视图的 center 设置为某个位置/关系,而 constraintsWithVisualFormat 字符串语法不允许您这样做。您必须使用constraintWithItem:attribute:...(或在 nib/storyboard 中设置)。

以下代码将一个视图水平居中于另一个视图中:

NSLayoutConstraint* con =
 [NSLayoutConstraint
  constraintWithItem:subview attribute:NSLayoutAttributeCenterX
  relatedBy:0
  toItem:superview attribute:NSLayoutAttributeCenterX
  multiplier:1 constant:0];
[superview addConstraint:con];

要将子视图设置为在 nib 中居中,请使用编辑器菜单在其父视图中水平或垂直居中,然后摆脱任何多余的约束(如果有的话 - nib 编辑器通常非常适合获取当您居中时自动摆脱这些)。

哦,抱歉,还有一件事:关于约束的美妙之处之一是您可以约束到任何其他视图。标签可能在文本视图的 front 中,但这并不意味着它必须被限制在文本视图中。如果你愿意,它可以,但我认为它会随着文本视图滚动。

这应该可以帮助您入门。我的书中还有更多内容:http://www.apeth.com/iosBook/ch14.html#_autolayout

【讨论】:

谢谢马特。不过有一个问题——布局关系不是 NSLayoutRelationEqual 而不是 0 吗? 啊,没关系。我看到 NSLayoutRelation 枚举将 0 分配给 NSLayoutRelationEqual,所以它们是相同的。 是的,我在书中讨论了这个问题。你经常说NSLayoutRelationEqual,不如说0。这只是节省时间。 节省时间?仅仅因为 NSLayoutRelationEqual == 0 现在,并不意味着这将永远是正确的。 NSLayoutRelationEqual0 更容易理解/阅读

以上是关于使用 NSLayoutConstraints 在 UITextView 中将 UILabel 居中的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSLayoutConstraints 调整当前视图的大小

使用 NSLayoutConstraints 在 UIView 上简单滑动动画

使用 NSLayoutConstraints 在 UITextView 中将 UILabel 居中

在代码中创建 NSLayoutConstraints

使用 NSLayoutConstraints 时的警告

遇到 NSLayoutConstraints 问题并以编程方式使用自动布局时,UIViews 停留在 (0,0)