NSTextField 边距和填充? (Swift)
NSTextField margin and padding? (Swift)
我想知道是否可以为 NSTextField
设置边距或填充?
我实现了或多或少的自定义文本字段(此屏幕截图中的第一个)...
...使用此代码:
myTextField.wantsLayer = true
myTextField.layer?.cornerRadius = 2.0
myTextField.layer?.borderWidth = 1.0
myTextField.layer?.borderColor = CGColor(red: 0.69, green: 0.69, blue: 0.69, alpha: 1.0)
但是,感觉我必须在左侧添加一些填充,这样数字才不会太靠近边框。这可能吗?
我通常只是将 textField 放在容器视图中来执行此操作。您可以为视图提供任何您想要的角半径、边框等,然后使用您想要的任何填充将 textField 限制在内部。只需确保将 textField 的边框样式更改为 'none',否则您将能够在视图中看到它。
可能有一种方法可以像使用按钮一样更改内容插图,但我一直找不到它。
没有简单明了的方法可以做到这一点,但就像 AppKit 中的许多事情一样,一旦您确切地弄清楚需要子类化的内容,这并不难。我遇到了 this example by Hem Dutt,在我对 macOS 10.12 的测试中,这种方法似乎效果很好。简而言之,您只需要子类化 NSTextFieldCell
并重写几个方法来更改文本框。这是 Swift 3 的变体:
class CustomTextFieldCell: NSTextFieldCell {
private static let padding = CGSize(width: 4.0, height: 2.0)
override func cellSize(forBounds rect: NSRect) -> NSSize {
var size = super.cellSize(forBounds: rect)
size.height += (CustomTextFieldCell.padding.height * 2)
return size
}
override func titleRect(forBounds rect: NSRect) -> NSRect {
return rect.insetBy(dx: CustomTextFieldCell.padding.width, dy: CustomTextFieldCell.padding.height)
}
override func edit(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, event: NSEvent?) {
let insetRect = rect.insetBy(dx: CustomTextFieldCell.padding.width, dy: CustomTextFieldCell.padding.height)
super.edit(withFrame: insetRect, in: controlView, editor: textObj, delegate: delegate, event: event)
}
override func select(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, start selStart: Int, length selLength: Int) {
let insetRect = rect.insetBy(dx: CustomTextFieldCell.padding.width, dy: CustomTextFieldCell.padding.height)
super.select(withFrame: insetRect, in: controlView, editor: textObj, delegate: delegate, start: selStart, length: selLength)
}
override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
let insetRect = cellFrame.insetBy(dx: CustomTextFieldCell.padding.width, dy: CustomTextFieldCell.padding.height)
super.drawInterior(withFrame: insetRect, in: controlView)
}
}
我在原来的基础上做了一个显着的改变——重写 cellSize(forBounds:)
以增加单元格的最小高度。我正在使用自动布局来自动调整单元格的大小,因此如果没有覆盖,我的文本就会被剪裁。
我想知道是否可以为 NSTextField
设置边距或填充?
我实现了或多或少的自定义文本字段(此屏幕截图中的第一个)...
...使用此代码:
myTextField.wantsLayer = true
myTextField.layer?.cornerRadius = 2.0
myTextField.layer?.borderWidth = 1.0
myTextField.layer?.borderColor = CGColor(red: 0.69, green: 0.69, blue: 0.69, alpha: 1.0)
但是,感觉我必须在左侧添加一些填充,这样数字才不会太靠近边框。这可能吗?
我通常只是将 textField 放在容器视图中来执行此操作。您可以为视图提供任何您想要的角半径、边框等,然后使用您想要的任何填充将 textField 限制在内部。只需确保将 textField 的边框样式更改为 'none',否则您将能够在视图中看到它。
可能有一种方法可以像使用按钮一样更改内容插图,但我一直找不到它。
没有简单明了的方法可以做到这一点,但就像 AppKit 中的许多事情一样,一旦您确切地弄清楚需要子类化的内容,这并不难。我遇到了 this example by Hem Dutt,在我对 macOS 10.12 的测试中,这种方法似乎效果很好。简而言之,您只需要子类化 NSTextFieldCell
并重写几个方法来更改文本框。这是 Swift 3 的变体:
class CustomTextFieldCell: NSTextFieldCell {
private static let padding = CGSize(width: 4.0, height: 2.0)
override func cellSize(forBounds rect: NSRect) -> NSSize {
var size = super.cellSize(forBounds: rect)
size.height += (CustomTextFieldCell.padding.height * 2)
return size
}
override func titleRect(forBounds rect: NSRect) -> NSRect {
return rect.insetBy(dx: CustomTextFieldCell.padding.width, dy: CustomTextFieldCell.padding.height)
}
override func edit(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, event: NSEvent?) {
let insetRect = rect.insetBy(dx: CustomTextFieldCell.padding.width, dy: CustomTextFieldCell.padding.height)
super.edit(withFrame: insetRect, in: controlView, editor: textObj, delegate: delegate, event: event)
}
override func select(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, start selStart: Int, length selLength: Int) {
let insetRect = rect.insetBy(dx: CustomTextFieldCell.padding.width, dy: CustomTextFieldCell.padding.height)
super.select(withFrame: insetRect, in: controlView, editor: textObj, delegate: delegate, start: selStart, length: selLength)
}
override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
let insetRect = cellFrame.insetBy(dx: CustomTextFieldCell.padding.width, dy: CustomTextFieldCell.padding.height)
super.drawInterior(withFrame: insetRect, in: controlView)
}
}
我在原来的基础上做了一个显着的改变——重写 cellSize(forBounds:)
以增加单元格的最小高度。我正在使用自动布局来自动调整单元格的大小,因此如果没有覆盖,我的文本就会被剪裁。