2

我在各种不同的设置中都遇到了这个问题,无论是使用 IB 还是手动定义约束时。这是当前设置:

我在容器视图中有一个标签和一个文本字段,使用以下视觉格式约束:

H:|-(4)-[label(labelWidth)]-(4)-[editor]-(4)-|
option = NSLayoutFormatAlignAllFirstBaseline

V:|-(4)-[editor]-(4)-|

对于这些约束,标签位于屏幕左上角的容器视图之外(实际上位于导航栏下方)。

当我添加这些约束时:

V:|-(>=4)-[label]-(>=4)-|

标签位于距顶部 4pt 的位置(与新约束匹配)。

在这两种情况下,一旦我点击打开键盘然后再次关闭它的文本字段(无需更改即可),标签与文本字段基线正确对齐。

[编辑:添加了一些截图] 初始状态:

初始状态

键盘打开:

键盘打开

键盘关闭后正确显示:

关闭键盘后

在 Xcode 调试器中,基线约束在键盘打开和关闭之前显示为不活动,在键盘打开和关闭之后显示为活动。

似乎直到第一次编辑之后才(正确)计算文本字段的基线。使用 nil、@"" 或某些文本初始化文本字段不会影响行为。

问题是,是什么导致了这种行为,更重要的是,我能做些什么呢?

4

1 回答 1

1

如果文本字段是以编程方式创建的,或者如果 IB 未添加基线对齐约束,则文本字段基线视图未正确定位。

在正确的时间(见下文)调用 [textField setNeedsUpdateConstraints] 可以解决此问题。

就我而言,我有一个自定义容器视图,它添加/替换约束以将标签布局为文本字段。我不得不在容器视图的 layoutSubviews 方法中调用 [textField setNeedsUpdateConstraints]。在修改约束的 updateConstraints 中调用它没有帮助。

在文本字段已经具有基线对齐(任何视图、标签或另一个)的类似场景中,该基线对齐将被新的基线对齐替换,问题不会发生,显然是因为 IB 会以某种方式注意布局及时参与文本字段。

所以我的解决方法/解决方案是:

- (void)updateConstraints {
  // setup constraints for affected views in self.viewsDictionary
  [super updateConstraints];
}

- (void)layoutSubviews {
  [super layoutSubviews];
  for (UIView* view in self.viewDictionary.objectEnumerator) {
    [view setNeedsUpdateConstraints];
  }
}
于 2015-03-23T12:41:30.900 回答