Xcode的10.1,雨燕4.2,MACOS 10.14.2
我试图做一个简单的做了,那里有一系列NSTableView
行的MacOS的列表应用,每一个里面是一个NSTextField
。每个字段是一个待完成项目。我想NSTableView
行扩大以适应每个NSTextField
中的文本的大小。
我有以下所有工作的:
NSTextField
文字中并根据需要NSTableView
行扩大。自动布局约束在我的故事板设置。tableView.reloadData(forRowIndexes: ..., columnIndexes: ...)
设置文本和正确调整大小的表行。 但这样做tableView.reloadData()
每NSTextField
文本单行总是复位如下所示:如果你点击进入重新加载整个表后,有趣的是NSTextField
,现场调整大小以适合再次对其内容:我相信我已在我的NSTextField
所有适当的自动布局限制,我使用了定制的子类,以及(从helpful answer here):
class FancyField: 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 jibe with autolayout
let width = super.intrinsicContentSize.width
// Set the frame height to a reasonable number
self.frame.size.height = 150.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()
}
}
⭐️Here是一个样本项目:https://d.pr/f/90CTEh
我在茫然,还有什么我可以试试。有任何想法吗?
我认为这是在界面生成器的约束的一些基本问题。调整窗口的大小使一切都靠不住。此外,你应该在你validateEditing()
类textDidChange(forBounds:)
调用FancyField
。我创建了一个示例项目,已经做了你想要的Github什么
写评论,如果你有任何问题。
思考一点点吧,以为我会在这里添加代码的肉。只有真正需要工作的事情,是对的NSTextField更新时,“任务”正在更新。以下是对的NSTextField所需的代码。
public class DynamicTextField: NSTextField {
public override var intrinsicContentSize: NSSize {
if cell!.wraps {
let fictionalBounds = NSRect(x: bounds.minX, y: bounds.minY, width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
return cell!.cellSize(forBounds: fictionalBounds)
} else {
return super.intrinsicContentSize
}
}
public override func textDidChange(_ notification: Notification) {
super.textDidChange(notification)
if cell!.wraps {
validatingEditing()
invalidateIntrinsicContentSize()
}
}
}
希望能帮助到你。