我在视图中使用自动布局获得了一对可编辑的文本字段。 (为了完整起见,它们位于可编辑表格中的NSTableRowView
内,但我认为这不重要。)
我希望字段根据内容调整宽度,特别是在编辑后。
但是,NSTextField
不合作。每当编辑字段结束编辑时,我都会添加一些代码来记录intrinsicContentSize
,并且值始终 { NSViewNoInstrinsicMetric, 15 }
,这意味着该字段没有固有的宽度。
我看过很多关于多行NSTextField
和纵向(高度)调整大小,包装等的帖子,但我找不到任何适用于此处的问题或答案。这些字段都设置为“使用单行”,“剪辑”和“滚动”。
我已尝试发送字段updateConstraints
和invalidateIntrinsicContentSize
消息,但它们似乎没有任何效果。
我知道我可以创建NSTextField的子类并破解它,但我不明白为什么这不起作用。或者NSTextField
可能根本没有内在宽度,但我无法在任何地方找到记录。
注意:以前只设置field.editable = NO
的答案不足;这些字段必须是可编辑的。
答案 0 :(得分:0)
这是我的黑客:
//
// Create a special text field subclass that provides an intrinsic width for its content.
// Editable NSTextFields normally do not have an intrinsic width, because I guess that would just be too weird.
// This field returns an intrinsic width when not being edited, and the width of its superview when it is.
//
@interface ResizingPatternTextField : NSTextField
@end
@implementation ResizingPatternTextField
- (BOOL)becomeFirstResponder
{
BOOL willEdit = [super becomeFirstResponder];
if (willEdit)
[self invalidateIntrinsicContentSize];
return willEdit;
}
- (void)textDidEndEditing:(NSNotification*)notification
{
[super textDidEndEditing:notification];
[self invalidateIntrinsicContentSize];
}
- (NSSize)intrinsicContentSize
{
NSSize intrinsiceSize = super.intrinsicContentSize;
if (self.currentEditor!=nil)
{
// The field is currently being edited: return the width of the superview as the intrinsic width
// This should cause the field to expand to it's maximum width, within the constraints of the layout
intrinsiceSize.width = self.superview.bounds.size.width;
}
else
{
// If the field isn't being edited and it's editable: calculate the width of the field ourselves
if (self.editable)
{
NSDictionary* textAttrs = @{ NSFontAttributeName: self.font };
NSSize textSize = [self.stringValue sizeWithAttributes:textAttrs];
// Return an intrinsic size with a little padding, rounded up to the nearest whole integer
intrinsiceSize.width = CGCeiling(textSize.width+7.0);
}
}
return intrinsiceSize;
}
注意:
CGCeiling
只是ceil()