使用NSLayoutConstraints将UILabel置于UITextView中

时间:2013-04-11 17:37:14

标签: iphone ios cocoa-touch autolayout

我正在尝试向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模拟器中标签左对齐的片段:

enter image description here

1 个答案:

答案 0 :(得分:4)

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

这是将一个视图水平居中于另一个视图的代码:

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