【问题标题】:Rounded NSTextField draws with transparent corners?圆角 NSTextField 用透明角绘制?
【发布时间】:2016-07-18 03:40:36
【问题描述】:

我的 NSTextField 有圆角和白色背景色,但看起来好像视图本身是矩形的。这意味着圆角和边界矩形之间的空间显示为透明。如何填写此区域以使其不显眼?

图片:

代码:

let textFieldLayer = CALayer()
textField.layer = textFieldLayer
textField.backgroundColor = NSColor.whiteColor()
textField.layer?.backgroundColor = NSColor.whiteColor().CGColor
textField.layer?.borderColor = NSColor(calibratedRed: 47/255.0, green: 146/255.0, blue: 204/255.0, alpha: 1.0).CGColor
textField.layer?.borderWidth = 1
textField.layer?.cornerRadius = 7

【问题讨论】:

  • 你是如何精确地圆角的?
  • 请出示您尝试过的代码。
  • 添加了上面的代码。感谢您的帮助。
  • @user3225395 旧问题但textField.wantsLayer = true 而不是textField.layer = textFieldLayer

标签: swift macos cocoa interface-builder nstextfield


【解决方案1】:

我通过继承 NSTextField 并覆盖它的 drawRect 方法来做到这一点:

override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)
    var bounds: NSRect = self.bounds
    var border: NSBezierPath = NSBezierPath(roundedRect: NSInsetRect(bounds, 0.5, 0.5), xRadius: 3, yRadius: 3)
    NSColor(red: 47 / 255.0, green: 146 / 255.0, blue: 204 / 255.0, alpha: 1.0).set()
    border.stroke()
}

【讨论】:

  • 这是解决原始问题的好方法,但如果使用对焦环,则会遇到类似问题;如果你覆盖它,这是一个简单的修复。
【解决方案2】:

我知道这是旧的,但以防其他人在这里寻找。在自定义 NSTextField 时,我发现 Medium 上的 this post 非常有用。这利用了文本字段的 CALayer。以下是相关位链接中的 sn-p:

override fun viewDidLoad() {
super.viewDidLoad()
inputTextField.wantsLayer = true
let textFieldLayer = CALayer()
inputTextField.layer = textFieldLayer
inputTextField.backgroundColor = fieldBackgroundColor
inputTextField.layer?.backgroundColor = fieldBackgroundColor.cgColor
inputTextField.layer?.borderColor = fieldBorderColor.cgColor
inputTextField.layer?.borderWidth = 1
inputTextField.layer?.cornerRadius = 5
inputTextField.textColor = fieldTextColor
}

还请注意,如果您在 IB 中使用 NSTextField 的默认设置,您可能无法获得预期的结果。我发现如果边框选择不是第一个选项,则此方法无法正常工作:

【讨论】:

  • OP 的问题可能来自缺少“inputTextField.wantsLayer = true”