NSTextField上的自定义边框

时间:2019-02-08 11:01:14

标签: swift cocoa appkit

我想自定义NSTextFields的边框。我已经搜索了一下,并且相当确定需要在ResG的NSTextFieldCell中完成此操作,但是不确定如何执行。

特别是我只想要一个底边框,比正常情况稍厚。

3 个答案:

答案 0 :(得分:2)

您可能应该阅读NSCell的文档。它表示必须在draw(withFrame:in)函数中绘制边框,并且如果覆盖drawInterior(withFrame:in:),则必须调用draw(withFrame:in)。此外,您必须覆盖cellSize并返回适当的大小以考虑新边框。我将示例更新为完整的解决方案。在Github

上创建了一个示例项目
/**
 Creates an custom border, that is just a line underneath the NSTextField.
 */
class CustomBorderTextFieldCell: NSTextFieldCell {
    // How thick should the border be
    let borderThickness: CGFloat = 3

    // Add extra height, to accomodate the underlined border, as the minimum required size for the NSTextField
    override var cellSize: NSSize {
        let originalSize = super.cellSize
        return NSSize(width: originalSize.width, height: originalSize.height + borderThickness)
    }

    // Render the custom border for the NSTextField
    override func draw(withFrame cellFrame: NSRect, in controlView: NSView) {
        // Area that covers the NSTextField itself. That is the total height minus our custom border size.
        let interiorFrame = NSRect(x: 0, y: 0, width: cellFrame.width, height: cellFrame.height - borderThickness)

        let path = NSBezierPath()
        path.lineWidth = borderThickness
        // Line width is at the center of the line.
        path.move(to: NSPoint(x: 0, y: cellFrame.height - (borderThickness / 2)))
        path.line(to: NSPoint(x: cellFrame.width, y: cellFrame.height - (borderThickness / 2)))
        NSColor.black.setStroke()
        path.stroke()

        // Pass in area minus the border thickness in the height
        drawInterior(withFrame: interiorFrame, in: controlView)
    }
}

这是结果 Custom NSTextField Border

答案 1 :(得分:0)

您可以在文本字段中添加背景图像,并且不设置边框样式。

答案 2 :(得分:0)

将此代码添加到NSTableHeaderCell

override func draw(withFrame cellFrame: NSRect,
                     in controlView: NSView) {
    let path = NSBezierPath()
    path.lineWidth = borderWidth
    // Line width is at the center of the line.
    path.move(to: NSPoint(x: cellFrame.minX, y: cellFrame.minY))
    path.line(to: NSPoint(x: cellFrame.maxX, y: cellFrame.minY))
    NSColor.black.setStroke()
    path.stroke()

    self.drawInterior(withFrame: cellFrame, in: controlView)
  }