【问题标题】:Custom Border on NSTextFieldNSTextField 上的自定义边框
【发布时间】:2019-02-08 11:01:14
【问题描述】:

我想自定义 NSTextFields 的边框。我已经四处搜索,并且相当确定这需要在drawInterior(withFrame:in:) 的 NSTextFieldCell 中完成,但不确定如何。

具体来说,我只想要一个底部边框,比正常的稍厚。

【问题讨论】:

标签: swift cocoa appkit


【解决方案1】:

您可能应该阅读NSCell 的文档。它说您必须在draw(withFrame:in) 函数中绘制边框,如果您覆盖draw(withFrame:in),则必须调用drawInterior(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)
    }
}

这是结果

【讨论】:

    【解决方案2】:

    您可以将文本字段添加为背景图像并将边框样式设置为无。

    【讨论】:

      【解决方案3】:

      将此代码添加到 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)
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        相关资源
        最近更新 更多