Swift NSTableView第一行最初显示在标题后面
我正在以编程方式在应用程序中创建tableView,遇到以下问题: 每当my tableView的内容大小大于其框架时,tableView的第一行最初会显示在标题下,,但它可以轻松地滚动回该位置。 初始加载后窗口外观的屏幕截图 内容大小大于tableView框架(问题在这里): 内容大小小于tableView框架(此处均适用): 我的NSViewController类代码:Swift NSTableView第一行最初显示在标题后面,swift,macos,cocoa,nstableview,appkit,Swift,Macos,Cocoa,Nstableview,Appkit,我正在以编程方式在应用程序中创建tableView,遇到以下问题: 每当my tableView的内容大小大于其框架时,tableView的第一行最初会显示在标题下,,但它可以轻松地滚动回该位置。 初始加载后窗口外观的屏幕截图 内容大小大于tableView框架(问题在这里): 内容大小小于tableView框架(此处均适用): 我的NSViewController类代码: class MainViewController: NSViewController, NSTableViewDele
class MainViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
let label: NSTextField = {
let label = NSTextField()
label.stringValue = "Test App"
label.font = NSFont.boldSystemFont(ofSize: 14)
label.textColor = .white
label.alignment = .center
label.drawsBackground = false
label.isBezeled = false
label.isSelectable = true
label.isEditable = false
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let labelContainerView: NSView = {
let view = NSView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
let tableView: NSTableView = {
let tableView = NSTableView()
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.usesAlternatingRowBackgroundColors = true
let column = NSTableColumn(identifier: .init(rawValue: "MyColumnID"))
column.headerCell.title = "Test"
column.headerCell.alignment = .center
tableView.addTableColumn(column)
return tableView
}()
let scrollView: NSScrollView = {
let scrollView = NSScrollView()
scrollView.hasVerticalScroller = true
scrollView.translatesAutoresizingMaskIntoConstraints = false
return scrollView
}()
override func loadView() {
view = NSView()
view.wantsLayer = true
}
var names: [String] = []
override func viewDidLoad() {
super.viewDidLoad()
layoutUI()
for i in 1...9 {
let name = "Test \(i)"
names.append(name)
}
scrollView.documentView = tableView
tableView.delegate = self
tableView.dataSource = self
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let newCell = MyCellView(identfier: NSUserInterfaceItemIdentifier(rawValue: "MyColumnID"))
newCell.textView.stringValue = names[row]
return newCell
}
func numberOfRows(in tableView: NSTableView) -> Int {
return names.count
}
func layoutUI() {
view.addSubview(labelContainerView)
view.addSubview(scrollView)
labelContainerView.addSubview(label)
NSLayoutConstraint.activate([
labelContainerView.topAnchor.constraint(equalTo: view.topAnchor),
labelContainerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
labelContainerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
labelContainerView.heightAnchor.constraint(equalTo: view.heightAnchor,
multiplier: 1/5),
label.centerXAnchor.constraint(equalTo: labelContainerView.centerXAnchor),
label.centerYAnchor.constraint(equalTo: labelContainerView.centerYAnchor,
constant: -4),
scrollView.heightAnchor.constraint(equalTo: view.heightAnchor,
multiplier: 4/5),
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
}
}我不建议在代码中设置NSTableView。在Interface Builder中执行此操作要容易得多,并且可以防止不必要的副作用。在任何情况下,如果NSTableView未按预期显示第一行,我将在相关NSScrollView上使用scrollToVisible使第一行在加载数据后可见。我一直在处理相同的问题(以编程方式创建滚动表)。我构建了一个实验板版本,除了这个特殊的问题之外,它还可以工作 当NSTableView有一个NSTableHeaderView时,NSScrollview实际上有两个NSClipView。从.contentView属性访问的一个包含表视图,第二个包含标题和NSVisualEffectView。它们都是滚动视图的子视图 我通过调整contentView插图使其正常工作,即显示顶行:
scrollView.contentView.contentInsets = NSEdgeInsets(top: headerView!.frame.height, left: 0, bottom: 0, right: 0)
我尝试了各种各样的自动布局策略,但都不起作用,或者看起来有些可疑
下面是一个两列表的跟踪,该表填充了生成的数据,让我看看发生了什么
概述(不是代码,而是我将其格式化的唯一方法):
两个剪辑视图及其帧矩形。0是内容视图:
ClipView 0 (0.0, 0.0, 500.0, 438.0)
NSTableBackgroundView 0 (-250.0, -456.0, 1000.0, 456.0)
NSTableView 1 (0.0, 0.0, 500.0, 4750.0)
ClipView 1 (0.0, 0.0, 500.0, 23.0)
NSVisualEffectView 0 (0.0, 0.0, 500.0, 23.0)
NSTableHeaderView 1 (0.0, 0.0, 500.0, 23.0)
还是不完全明白发生了什么
但我确实相信,在没有IB魔法的情况下,了解这些东西在引擎盖下是如何工作的是一项值得的练习
ClipView 0 (0.0, 0.0, 500.0, 438.0)
NSTableBackgroundView 0 (-250.0, -456.0, 1000.0, 456.0)
NSTableView 1 (0.0, 0.0, 500.0, 4750.0)
ClipView 1 (0.0, 0.0, 500.0, 23.0)
NSVisualEffectView 0 (0.0, 0.0, 500.0, 23.0)
NSTableHeaderView 1 (0.0, 0.0, 500.0, 23.0)