Lion 中的自动布局应该让文本字段(以及标签)随其包含的文本一起增长变得相当简单。
文本字段设置为在 Interface Builder 中换行。
有什么简单可靠的方法来做到这一点?
Lion 中的自动布局应该让文本字段(以及标签)随其包含的文本一起增长变得相当简单。
文本字段设置为在 Interface Builder 中换行。
有什么简单可靠的方法来做到这一点?
intrinsicContentSize
中的方法NSView
返回视图本身认为的内在内容大小。
NSTextField
计算此值时不考虑wraps
其单元格的属性,因此如果布局在单行上,它将报告文本的尺寸。
因此,自定义子类NSTextField
可以覆盖此方法以返回更好的值,例如单元格cellSizeForBounds:
方法提供的值:
-(NSSize)intrinsicContentSize
{
if ( ![self.cell wraps] ) {
return [super intrinsicContentSize];
}
NSRect frame = [self frame];
CGFloat width = frame.size.width;
// Make the frame very high, while keeping the width
frame.size.height = CGFLOAT_MAX;
// Calculate new height within the frame
// with practically infinite height.
CGFloat height = [self.cell cellSizeForBounds: frame].height;
return NSMakeSize(width, height);
}
// you need to invalidate the layout on text change, else it wouldn't grow by changing the text
- (void)textDidChange:(NSNotification *)notification
{
[super textDidChange:notification];
[self invalidateIntrinsicContentSize];
}
基于 Peter Lapisu 的 Objective-C 帖子
子类NSTextField
,添加下面的代码。
override var intrinsicContentSize: NSSize {
// Guard the cell exists and wraps
guard let cell = self.cell, cell.wraps else {return super.intrinsicContentSize}
// Use intrinsic width to jive with autolayout
let width = super.intrinsicContentSize.width
// Set the frame height to a reasonable number
self.frame.size.height = 750.0
// Calcuate height
let height = cell.cellSize(forBounds: self.frame).height
return NSMakeSize(width, height);
}
override func textDidChange(_ notification: Notification) {
super.textDidChange(notification)
super.invalidateIntrinsicContentSize()
}
设置self.frame.size.height
为“一个合理的数字”可以避免使用FLT_MAX
,CGFloat.greatestFiniteMagnitude
或大数字时的一些错误。当用户选择突出显示字段中的文本时,会在操作过程中出现错误,他们可以向上和向下拖动滚动到无穷大。此外,当用户输入文本时,它NSTextField
会被空白,直到用户结束编辑。最后,如果用户选择了NSTextField
,然后尝试调整窗口大小,如果 的值self.frame.size.height
太大,窗口将挂起。