我有一个有两个UITextFields (没有边框)的UITableViewCell。以下约束用于设置水平布局。
@"|-10-[leftTextField(>=80)]-(>=10)-[rightTextField(>=40)]-10-|"
没有什么花哨的东西,并按预期工作。
如您所见,上面的textField具有正确的大小。较低的textField从一个空文本开始,由于这个空文本,它的宽度为80磅。当我在编辑textField中键入文本时,文本会向左滚动,但不会改变宽度。
我不喜欢这样,当用户在textField中输入内容时,textField的宽度应该调整。
在我看来,这应该是开箱即用的。通过实现UIControlEventEditingChanged
事件的IBAction
,我可以确认输入实际上更改了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));
}
有人知道我错过了什么吗?我该怎么做才能让它工作呢?
发布于 2015-01-18 11:17:49
我不明白为什么UITextField
只在退出first responder状态时才更新intrinsicContentSize
。这在iOS 7和iOS 8上都会发生。
作为临时解决方案,我覆盖intrinsicContentSize
并使用typingAttributes
确定大小。这也适用于leftView
和rightView
// 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
}
在这里,我将其加宽以说明插入符号
发布于 2016-07-23 03:16:34
这就是Swift的答案。另外,如果有占位符,此代码段不会折叠文本字段。
// 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()
}
}
发布于 2013-08-17 03:10:26
我对UITextView
也有类似的要求(必须动态增加它的高度和其他一些东西)。
我所做的类似于下面的内容:
考虑到self.contentView
是textField
的superview
- (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));
}
此外,考虑到我的需求,我必须覆盖我的UITextView
的superview
的updateConstraints
方法。
如果您选择该解决方案(也许是一种更微调的方法),您可以这样做:
- (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];
}
如前所述,我之所以使用覆盖选项,是因为我需要一种更微调的方法。
此外,像往常一样,您需要确保检查您认为可能遇到的任何边缘情况(就大小值而言)。
希望这能有所帮助!
干杯!
https://stackoverflow.com/questions/18236661
复制相似问题