如何在自定义表格中垂直对齐文本

问题描述 投票:0回答:1

我有一个显示自定义表格的快速程序。最初,我错误地为每个单元格使用了 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")
    }
}

swift macos nstableview nstablecellview
1个回答
0
投票

经过更多思考,我意识到我需要做的就是访问单元格文本的基线偏移量。因此,我对 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()
    }
}


© www.soinside.com 2019 - 2024. All rights reserved.