3

我正在尝试将 a 添加UILabel到 aUITextView并使其居中于 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 模拟器中标签如何左对齐的片段:

在此处输入图像描述

4

1 回答 1

4

您不能用于constraintsWithVisualFormat创建居中约束。您必须将视图的中心设置为某个位置/关系,而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 编辑器通常非常适合摆脱这些当您居中某物时自动)。

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

那应该让你开始。我的书中还有更多内容:http ://www.aeth.com/iOSBook/ch14.html#_autolayout

于 2013-04-11T17:39:47.867 回答