我有一个UITableViewCell,其中有两个UITextField(无边框)。以下约束用于设置水平布局。
@"|-10-[leftTextField(>=80)]-(>=10)-[rightTextField(>=40)]-10-|"
没什么花哨的,并且按预期工作。

如您所见,上方的textField具有正确的大小。下部的textField以空文本开头,由于空文本,它的宽度为80点。当我在编辑textField中键入文本时,文本将滚动到左侧,但不会更改其宽度。

我不喜欢这样,当用户键入该textField时,应该调整textField的宽度。

我认为应该开箱即用。通过为IBAction事件实现UIControlEventEditingChanged,我可以确认键入实际上会更改UITextField的intrinsicContentSize

但是,直到textField不再是第一个响应者,宽度才改变。如果将光标放在另一个textField中,则会设置已编辑textField的宽度。对于我想要的来说有点晚了。

这些注释掉的行是我没有成功的尝试:

- (IBAction)textFieldDidChange:(UITextField *)textField {
    [UIView animateWithDuration:0.1 animations:^{
//        [self.contentView removeConstraints:horizontalConstraints];
//        [self.contentView addConstraints:horizontalConstraints];
//        [self.contentView layoutIfNeeded];

//        [self.contentView setNeedsLayout];

//        [self.contentView setNeedsUpdateConstraints];
    }];
    NSLog(@"%@", NSStringFromCGSize(textField.intrinsicContentSize));
}

有人知道我在想什么吗?我可以尝试做些什么?

最佳答案

这对我有用:

- (IBAction) textFieldDidChange: (UITextField*) textField
{
    [UIView animateWithDuration:0.1 animations:^{
        [textField invalidateIntrinsicContentSize];
    }];
}

有趣的是,考虑到此text from the docs,它似乎应该开箱即用:



我最好的猜测是,文本字段仅在编辑完成后才调用invalidateIntrinsicContentSize,而不是在此期间调用。

编辑:一堆“这对我不起作用”。我认为这里的困惑可能是与textFieldDidChange:处理程序相关的触发事件。该事件必须为UIControlEventEditingChanged。如果您使用的是IB,请仔细检查您是否正在处理正确的事件。
UITextField的大小也不能受到限制。您可以使用约束将其锁定在适当的位置,但是任何宽度约束或左右定位约束集都将阻止其调整为内部内容大小。

10-06 13:09