我使用故事板来设计我的基于NSTableView视图及其具有自动布局的子视图。它工作正常并且表现如预期。
在我的NSTableCellView,我有倍数NSTextField。我希望以编程方式更改其中一个中的框架。所以我尝试了这样的事情。
dataSource = NSTableViewDiffableDataSource<Section, Item>(tableView: someTableView, cellProvider: { tableView, tableColumn, row, item -> NSView in
guard let tableCellView = tableView.makeView(withIdentifier: .someTableCellView, owner: self) as? SomeTableCellView else {
fatalError()
}
tableCellView.randomTextField.stringValue = "Something..."
tableCellView.someTextField.stringValue = "Blah..."
//...
let size = NSSize(width: 200, height: 50)
tableCellView.someTextField.setFrameSize(size)
tableCellView.someTextField.needsLayout = true
tableCellView.needsLayout = true
return tableCellView
})
对于tableCellView.someTextFieldand tableCellView,我尝试了以下组合,但似乎没有任何改变:
.needsDisplay = true.needsLayout = true.invalidateIntrinsicContentSize().layoutSubtreeIfNeeded().updateConstraints().layout()
为什么这么难?我的理解是,如果我设置了一个新的帧大小someTextField,然后通知tableCellView它需要重新计算子视图布局位置,因为someTextField已被修改,因此其他子视图需要重新定位自己以与自动布局约束一致。