首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >键入时调整UITextField大小(通过使用自动布局)

键入时调整UITextField大小(通过使用自动布局)
EN

Stack Overflow用户
提问于 2013-08-14 23:59:27
回答 7查看 31.3K关注 0票数 56

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

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

没有什么花哨的东西,并按预期工作。

如您所见,上面的textField具有正确的大小。较低的textField从一个空文本开始,由于这个空文本,它的宽度为80磅。当我在编辑textField中键入文本时,文本会向左滚动,但不会改变宽度。

我不喜欢这样,当用户在textField中输入内容时,textField的宽度应该调整。

在我看来,这应该是开箱即用的。通过实现UIControlEventEditingChanged事件的IBAction,我可以确认输入实际上更改了UITextField的intrinsicContentSize

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

这些被注释掉的代码是我尝试过的,但没有成功:

代码语言:javascript
复制
- (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));
}

有人知道我错过了什么吗?我该怎么做才能让它工作呢?

EN

回答 7

Stack Overflow用户

发布于 2015-01-18 11:17:49

我不明白为什么UITextField只在退出first responder状态时才更新intrinsicContentSize。这在iOS 7和iOS 8上都会发生。

作为临时解决方案,我覆盖intrinsicContentSize并使用typingAttributes确定大小。这也适用于leftViewrightView

代码语言:javascript
复制
// 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
  }

在这里,我将其加宽以说明插入符号

票数 20
EN

Stack Overflow用户

发布于 2016-07-23 03:16:34

这就是Swift的答案。另外,如果有占位符,此代码段不会折叠文本字段。

代码语言:javascript
复制
// UITextField subclass

override func awakeFromNib() {
    super.awakeFromNib()
    self.addTarget(self, action: #selector(textFieldTextDidChange), forControlEvents: .EditingChanged)
}

func textFieldTextDidChange(textField: UITextField) {
    textField.invalidateIntrinsicContentSize()
}

override func intrinsicContentSize() -> CGSize {
    if self.editing {
        let textSize: CGSize = NSString(string: ((text ?? "" == "") ? self.placeholder : self.text) ?? "").sizeWithAttributes(self.typingAttributes)
        return CGSize(width: textSize.width + (self.leftView?.bounds.size.width ?? 0) + (self.rightView?.bounds.size.width ?? 0) + 2, height: textSize.height)
    } else {
        return super.intrinsicContentSize()
    }
}
票数 4
EN

Stack Overflow用户

发布于 2013-08-17 03:10:26

我对UITextView也有类似的要求(必须动态增加它的高度和其他一些东西)。

我所做的类似于下面的内容:

考虑到self.contentViewtextFieldsuperview

代码语言:javascript
复制
- (IBAction)textFieldDidChange:(UITextField *)textField {
    //You can also use "textField.superview" instead of "self.contentView"
    [self.contentView setNeedsUpdateConstraints];

    //Since you wish to animate that expansion right away...
    [UIView animateWithDuration:0.1 animations:^{
        [self.contentView updateConstraintsIfNeeded];
    }];
    NSLog(@"%@", NSStringFromCGSize(textField.intrinsicContentSize));
}

此外,考虑到我的需求,我必须覆盖我的UITextViewsuperviewupdateConstraints方法。

如果您选择该解决方案(也许是一种更微调的方法),您可以这样做:

代码语言:javascript
复制
- (void)updateConstraints {
    [super updateConstraints];

    //Firstly, remove the width constraint from the textField.
    [self.myTextField removeConstraint:self.textFieldWidthConstraint];
    self.textFieldWidthConstraint = nil;

    CGSize contentSize = self.myTextField.intrinsicContentSize;
    self.textFieldWidthConstraint = [NSLayoutConstraint constraintWithItem:self.myTextField attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:contentSize.width];

    [self.myTextField addConstraint:self.textFieldWidthConstraint];
}

如前所述,我之所以使用覆盖选项,是因为我需要一种更微调的方法。

此外,像往常一样,您需要确保检查您认为可能遇到的任何边缘情况(就大小值而言)。

希望这能有所帮助!

干杯!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18236661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档