键入时调整UITextField的大小(使用Autolayout)

Mat*_*uch 54 iphone cocoa-touch uitextfield autolayout

我有一个UITableViewCell,它有两个UITextFields(没有边框).以下约束用于设置水平布局.

@"|-10-[leftTextField(>=80)]-(>=10)-[rightTextField(>=40)]-10-|"

没有什么花哨的,并且按预期工作.

在此输入图像描述

如您所见,上部textField具有正确的大小.较低的textField以空文本开头,由于空文本,它是80点宽.当我在编辑textField中键入文本时,文本向左滚动,它不会改变其宽度.

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

在我看来,应该开箱即用.通过实施IBActionUIControlEventEditingChanged事件,我可以确认实际输入改变intrinsicContentSize的也是UITextField的.

但是,在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));
}
Run Code Online (Sandbox Code Playgroud)

有人知道我错过了什么吗?我有什么办法让这项工作成功?

Tom*_*ift 58

这对我有用:

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

有趣的是,考虑到文档中的文本,似乎它应该开箱即用:

此外,如果视图的属性发生更改并且该更改会影响内部内容大小,则视图必须调用invalidateIntrinsicContentSize,以便布局系统注意到更改并可以重新布局.在视图类的实现中,必须确保如果内部大小所依赖的任何属性的值发生更改,则调用invalidateIntrinsicContentSize.例如,如果字符串值更改,则文本字段将调用invalidateIntrinsicContentSize.

我最好的猜测是,一旦编辑完成,文本字段只调用invalidateIntrinsicContentSize,而不是在编辑期间.

编辑: 一堆"这对我不起作用".我认为这里的混乱可能是与textFieldDidChange:处理程序相关的触发事件.该事件需要是UIControlEventEditingChanged.如果您正在使用IB,请仔细检查您是否正在处理正确的事件.

UITextField也不能在尺寸上的限制.您可以使用约束将其锁定到位,但任何宽度约束或左右定位约束集都将阻止其调整其内在内容大小.

  • 这不适合我.在输入文本字段时,内在内容大小似乎没有变化,直到它终止第一个响应者,无论调用"invalidateIntrinsicContentSize" (18认同)

onm*_*133 19

我不知道为什么UITextFieldintrinsicContentSize在它重新启动其第一响应者状态时更新它.这适用于iOS 7和iOS 8.

作为临时解决方案,我使用覆盖intrinsicContentSize并确定大小typingAttributes.这解释了leftViewrightView

// This method is target-action for UIControlEventEditingChanged
func textFieldEditingChanged(textField: UITextField) {
  textField.invalidateIntrinsicContentSize()
}


override var intrinsicContentSize: CGSize {
    if isEditing {
      let string = (text ?? "") as NSString
      let size = string.size(attributes: typingAttributes)
      return CGSize(width: size.width + (rightView?.bounds.size.width ?? 0) + (leftView?.bounds.size.width ?? 0) + 2,
                    height: size.height)
    }

    return super.intrinsicContentSize
  }
Run Code Online (Sandbox Code Playgroud)

在这里,我更广泛地考虑到插入符号

  • 大.谢谢.这应该是正确的答案(至少对于iOS7/8) (2认同)
  • 在iOS 9和swift 2.2上为我工作 (2认同)