Mat*_*uch 54 iphone cocoa-touch uitextfield autolayout
我有一个UITableViewCell,它有两个UITextFields(没有边框).以下约束用于设置水平布局.
@"|-10-[leftTextField(>=80)]-(>=10)-[rightTextField(>=40)]-10-|"
没有什么花哨的,并且按预期工作.
如您所见,上部textField具有正确的大小.较低的textField以空文本开头,由于空文本,它是80点宽.当我在编辑textField中键入文本时,文本向左滚动,它不会改变其宽度.
我不喜欢这样,当用户键入textField时,textField的宽度应该调整.
在我看来,应该开箱即用.通过实施IBAction
该UIControlEventEditingChanged
事件,我可以确认实际输入改变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
也不能在尺寸上的限制.您可以使用约束将其锁定到位,但任何宽度约束或左右定位约束集都将阻止其调整其内在内容大小.
onm*_*133 19
我不知道为什么UITextField
只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
}
Run Code Online (Sandbox Code Playgroud)
在这里,我更广泛地考虑到插入符号
归档时间: |
|
查看次数: |
26201 次 |
最近记录: |