将NSTextField
子类化以为 OSX 创建自定义标签后,尝试使自动换行按预期工作时遇到了一些困难。
class Label: NSTextField {
//================================================================================
// MARK: - Properties
//================================================================================
var text: String {
get {
return stringValue
}
set {
stringValue = newValue
}
}
//================================================================================
// MARK: - Initialization
//================================================================================
convenience init() {
self.init(frame: NSRect())
isBezeled = false
backgroundColor = .clear
isEditable = false
isSelectable = false
cell?.usesSingleLineMode = false
cell?.wraps = true
cell?.lineBreakMode = .byWordWrapping
}
//================================================================================
// MARK: - Override
//================================================================================
public override var intrinsicContentSize: NSSize {
if cell?.wraps ?? false {
let fictionalBounds = NSRect(x: bounds.minX, y: bounds.minY, width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
return cell?.cellSize(forBounds: fictionalBounds) ?? .zero
} else {
return super.intrinsicContentSize
}
}
public override func textDidChange(_ notification: Notification) {
super.textDidChange(notification)
if cell?.wraps ?? false {
invalidateIntrinsicContentSize()
}
}
override func layout() {
preferredMaxLayoutWidth = alignmentRect(forFrame: frame).width
super.layout()
}
}
有时它可以工作,但是非常罕见。