在NSTableRowView内的NSTextField上进行自动布局和WordWrapping

时间:2019-02-17 14:34:20

标签: swift cocoa

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()
    }

}

有时它可以工作,但是非常罕见。

Sample of issue

0 个答案:

没有答案