Неверный интервал между элементами NSOutlineView

У меня есть NSOutlineView, и расстояние между элементами 1 и 2 больше, чем расстояние между всеми другими элементами. Это групповые предметы. Общий вид очень голый. Ниже мой код, а ниже - изображение проблемы, о которой я говорю:

var sections: [SidebarSection] = [
    SidebarSection(title: "Section 1", items: ["1", "2", "3", "4", "5"]),
    SidebarSection(title: "Section 2", items: ["1", "2"]),
    SidebarSection(title: "Section 3", items: ["1", "2"]), 
    SidebarSection(title: "Section 4", items: ["1", "2"]), 
    SidebarSection(title: "Section 5", items: ["1", "2"])]

private let outlineView: SidebarOutlineView = SidebarOutlineView()

extension SidebarViewController: NSOutlineViewDataSource {

    func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
        return item is SidebarSection
    }
    
    func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
        if let section = item as? SidebarSection {
            return section.items[index]
        }
    
        return sections[index]
    }

    func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
        if let section = item as? SidebarSection {
            return section.items.count
        }
        return sections.count
    }
}

extension SidebarViewController: NSOutlineViewDelegate {

    func outlineView(_ outlineView: NSOutlineView, heightOfRowByItem item: Any) -> CGFloat {
        return 30
    }

    func outlineView(_ outlineView: NSOutlineView, isGroupItem item: Any) -> Bool {
        return item is SidebarSection
    }

    func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
        let view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SidebarPlaylistCell"), owner: self) as! SidebarPlaylistCell
        view.wantsLayer = true
        view.textLabel.stringValue = (item as? SidebarSection)?.title ?? ""
        view.imgView.wantsLayer = true
        view.imgView.layer?.backgroundColor = NSColor.red.cgColor
        return view
    }
}

extension SidebarViewController {

   func layout() {
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(scrollView)
    
        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    
        scrollView.documentView = outlineView
    
        outlineView.headerView = nil
    
        outlineView.delegate = self
        outlineView.dataSource = self
         outlineView.intercellSpacing = NSSize(width: 0, height: 0)
        scrollView.hasVerticalScroller = true
        scrollView.hasHorizontalScroller = false
        scrollView.wantsLayer = true
    
        view.layer?.backgroundColor = NSColor.blue.cgColor
    }
}


final class SidebarOutlineView: NSOutlineView {

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        let column: NSTableColumn = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("col1"))
        column.isEditable = false
        column.minWidth = 0
        addTableColumn(column)
        outlineTableColumn = column
    
        register(NSNib(nibNamed: "SidebarPlaylistCell", bundle: nil), forIdentifier: NSUserInterfaceItemIdentifier(rawValue: "SidebarPlaylistCell"))
        selectionHighlightStyle = .sourceList
        indentationPerLevel = 6.0
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}

Неверный интервал между элементами NSOutlineView

Каковы ограничения в представлении SidebarPlaylistCell? Какова высота выполнения представлений строк?

Willeke 03.04.2021 12:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
69
1

Ответы 1

Этим поведением можно управлять с помощью логического флага floatsGroupRows, для которого по умолчанию установлено значение true. Итак, добавив:

outlineView.floatsGroupRows = false

вы получите желаемое поведение.

Документацию можно найти здесь: https://developer.apple.com/documentation/appkit/nstableview/1528624-floatsgrouprows?language=swift

A Boolean value indicating whether the table view draws grouped rows as if they are floating.

Быстрый тест

quick test

Значение floatGroupRows

Эффект floatsGroupRows лучше виден в анимированной графике. Во время операции прокрутки текущий GroupItem остается плавающим сверху:

scroll demo of floatsGroupRows

Что именно это значит? Документация довольно бесполезна, я понимаю, что флаг bool контролирует, «рисует ли табличное представление сгруппированные строки, как если бы они были плавающими», но что именно означает «как будто они плавающие»?

Alexander 04.04.2021 19:41

Поскольку эффект floatsGroupRows легче увидеть в анимированной графике, я добавил это к ответу.

Stephan Schlecht 05.04.2021 13:26

Ааааааааааааааааааааааааааааа! Хорошо, спасибо!

Alexander 05.04.2021 15:38

Другие вопросы по теме