我有一个显示自定义表格的快速程序。最初,我错误地为每个单元格使用了 NSTextField 并遇到了格式问题。如下图所示,每个单元格中的文本都位于顶部边框之上。我无法弄清楚如何解决这个问题,所以我在下面发布了我的原始代码。回复建议我将 NSTextField 更改为 NSTableCellView。所以我更改了代码(新代码如下)以合并 NSTableCellView。不幸的是,我最终遇到了同样的格式问题。我认为我可以对 NSTableCellView 相对于其父级应用约束,但没有成功(尝试在委托中注释掉)。如果有人能指出我解决此问题的正确方向,我将不胜感激。如果我需要发布更多代码,请告诉我。
// Coordinators delegate
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
let dataCell = CustomTableCellView()
switch tableColumn?.identifier.rawValue {
case "fund":
dataCell.Setup(rectWidth: 100.0, row: row, column: tableColumn!, numberOfRows: closingValues.count)
dataCell.textField?.stringValue = closingValues[row].fundName
case "date":
dataCell.Setup(rectWidth: 120.0, row: row, column: tableColumn!, numberOfRows: closingValues.count)
dataCell.textField?.stringValue = SQLDateFormatter.string(from: closingValues[row].timeStamp)
default:
dataCell.Setup(rectWidth: 100.0, row: row, column: tableColumn!, numberOfRows: closingValues.count)
dataCell.textField?.stringValue = String(format: "$%.2f", closingValues[row].close)
}
// let constraints = [
// dataCell.topAnchor.constraint(equalTo: ??parent??.topAnchor, constant: 5.0)
// ]
// NSLayoutConstraint.activate(constraints)
return dataCell
}
// Custom NSTableCellView
class CustomTableCellView: NSTableCellView {
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
}
func Setup(rectWidth: CGFloat, row: Int, column: NSTableColumn, numberOfRows: Int) {
self.autoresizingMask = .width
let nsRectangle: NSRect = NSMakeRect(0, 0, rectWidth, 24)
let customTextField: CustomTextField = CustomTextField(frame: nsRectangle)
customTextField.SetTextAttributes(row: row, column: column, numberOfRows: numberOfRows)
self.textField = customTextField
self.addSubview(customTextField)
}
required init?(coder decoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
经过更多思考,我意识到我需要做的就是访问单元格文本的基线偏移量。因此,我对 CustomTextField 类进行了 2 处更改(代码如下)。 1) 注释掉 SetTextAttributes 函数中的所有文本属性。 2)在重写函数draw(_ dirtyRect:NSRect)中添加了super.draw(dirtyRect)上面的所有代码。通过访问属性字符串值,我可以访问基线偏移量。这允许我垂直向下移动文本。问题解决了。
class CustomTextField :NSTextField {
var row: Int = 0
var column: NSTableColumn = NSTableColumn()
var numberOfRows: Int = 0
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
func SetTextAttributes(row: Int, column: NSTableColumn, numberOfRows: Int) {
// textColor = .blue
// backgroundColor = .white
// isBordered = false
// isEditable = false
// font = NSFont(name: "Arial", size: 16)!
// alignment = .center
self.row = row
self.column = column
self.numberOfRows = numberOfRows
}
override func draw(_ dirtyRect: NSRect) {
isBordered = false
isEditable = false
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
attributedStringValue = NSAttributedString(string: stringValue, attributes:
[NSAttributedString.Key.foregroundColor: NSColor.blue,
NSAttributedString.Key.backgroundColor: NSColor.white,
NSAttributedString.Key.font: NSFont(name: "Arial", size: 16)!,
NSAttributedString.Key.paragraphStyle: paragraphStyle,
NSAttributedString.Key.baselineOffset: -4.0
])
super.draw(dirtyRect)
NSColor.lightGray.set()
let customBorder = NSBezierPath()
customBorder.move(to: NSMakePoint(0.0, dirtyRect.height))
customBorder.line(to: NSMakePoint(0.0, 0.0))
customBorder.line(to: NSMakePoint(dirtyRect.width, 0.0))
if column.title == "Closing" {
customBorder.line(to: NSMakePoint(dirtyRect.width, dirtyRect.height))
}
if row == numberOfRows - 1 {
if column.title == "Fund" || column.title == "Date" {
customBorder.move(to: NSMakePoint(dirtyRect.width, dirtyRect.height))
customBorder.line(to: NSMakePoint(0.0, dirtyRect.height))
}
customBorder.line(to: NSMakePoint(0.0, dirtyRect.height))
}
customBorder.lineWidth = 2
customBorder.stroke()
}
}