Сокрытие делителей в NSSplitView - PullRequest
1 голос
/ 11 февраля 2020

Поскольку NSSplitView не позволяет скрывать свои разделители (метод делегата позволяет скрывать только те разделители, которые находятся на границе разделенных видов), я решил использовать подкласс NSSplitView и переопределить его методы рисования, чтобы избежать указания c разделители с рисунка.

Однако, как только я переопределю либо draw(rect:), либо drawDivider(in:), NSSplitView больше не анимирует свои разделители, если я сверну такой элемент, как

activityItem.animator().isCollapsed = collapsed

Это даже происходит, если я вызываю super напрямую, не добавляя свой собственный код для рисования

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
}

Приведенного выше кода достаточно, чтобы полностью сломать анимацию.

В основном все, что я пытаюсь достичь, это скрытие элемента разделенного вида рядом с его разделителем, но это, очевидно, слишком много, чтобы просить о NSSplitView, не переопределяя его полностью.

Я здесь на последней капле. Есть ли другой способ сделать sh сокрытие предметов + делитель?

1 Ответ

0 голосов
/ 11 февраля 2020

Хорошо, я пошел совершенно другим путем и нашел способ заставить его работать. Поэтому, если вы пытаетесь полностью настроить разделители, вот как вы это делаете.

  1. Подкласс NSSplitView и возвращаете 0 из dividerThickness

Итак, ваш новый разделенное представление теперь вообще не отображает разделители, но вы можете добавить их вручную там, где вы хотите

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

Переопределить метод делегирования с разделенным представлением splitView(:additionalEffectiveRectOfDividerAt:) и возвращение вручную ректов, соответствующих вашим пользовательским NSBox делителям

Для получения эффективных ректов вам может потребоваться convert(:from:) между NSView координатами, но это работает! Делегат может выглядеть примерно так:

override func splitView(_ splitView: NSSplitView, additionalEffectiveRectOfDividerAt dividerIndex: Int) -> NSRect {
    let item = splitViewItems[dividerIndex]
    let itemView = item.viewController.view
    let frame = view.convert(itemView.bounds, from: itemView)

    let dividerFrame = CGRect(x: 0,
                              y: view.bounds.height - frame.minY,
                              width: frame.width,
                              height: 1)

    return dividerFrame
}

Вот так. Пользовательские разделители, которые также работают с анимацией!

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