Skip to content

Instantly share code, notes, and snippets.

@mminer
Last active October 18, 2017 04:47
Show Gist options
  • Save mminer/fc876e5dcaaeff8c1eb25163b677b985 to your computer and use it in GitHub Desktop.
Save mminer/fc876e5dcaaeff8c1eb25163b677b985 to your computer and use it in GitHub Desktop.
Vertically centred NSTextFieldCell.
import AppKit
class VerticallyCenteredTextFieldCell: NSTextFieldCell {
// Adapted from http://stackoverflow.com/a/8626071
override func drawInterior(withFrame cellFrame: NSRect, in controlView: NSView) {
let adjustedFrame = adjusted(frame: cellFrame)
super.drawInterior(withFrame: adjustedFrame, in: controlView)
}
override func drawingRect(forBounds rect: NSRect) -> NSRect {
let adjustedFrame = adjusted(frame: rect)
return super.drawingRect(forBounds: adjustedFrame)
}
override func edit(withFrame rect: NSRect, in controlView: NSView, editor textObj: NSText, delegate: Any?, event: NSEvent?) {
let adjustedFrame = adjusted(frame: rect)
super.edit(withFrame: adjustedFrame, 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 adjustedFrame = adjusted(frame: rect)
super.select(withFrame: adjustedFrame, in: controlView, editor: textObj, delegate: delegate, start: selStart, length: selLength)
}
private func adjusted(frame: NSRect) -> NSRect {
let cellFont = font ?? NSFont.systemFont(ofSize: NSFont.systemFontSize)
let fontHeight = cellFont.ascender - cellFont.descender
let offset = floor((frame.height - fontHeight) / 2)
return frame.insetBy(dx: 0, dy: offset)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment