Авторазметка и перенос WordPrapping в NSTextField внутри NSTableRowView - PullRequest
0 голосов
/ 17 февраля 2019

После создания подкласса 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...