Цвет фона SwiftUI для ОС List Ma c - PullRequest
5 голосов
/ 28 февраля 2020

Я использую ListView в ОС Ma c. Я пытаюсь изменить цвет фона этого ListView. Однако это не так просто, как ожидалось.

Я пытался использовать атрибут .background(Color(.red)) в ListView. Это ничего не изменило.

Я смог найти только .listRowBackground(Color(.red)), который оказал влияние на строки таблицы. Однако другой фон не был достигнут.

Я подготовил небольшую демонстрацию, чтобы продемонстрировать:

На мой взгляд тело:

  VStack
    {
        List()
        {
            Text("Test")
                .listRowBackground(Color.green)

            Text("Test")
                .listRowBackground(Color.green)

            Text("Test")
                .listRowBackground(Color.green)

        }.background(Color(.red))

    }.background(Color(.red))

Вот результат, который я получаю :

enter image description here

Основной фон не изменяется. Я читал о решении, меняющем UITableView.appearance, но это невозможно для меня в SwiftUI для ОС Ma c.

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 29 февраля 2020

Первое изображение показывает происхождение проблемы - используемый вид прокрутки по умолчанию непрозрачен, поэтому добавленный цветной фон есть, но не виден

demo1

Таким образом, решение состоит в том, чтобы найти этот вид прокрутки и отключение фона рисования

demo2

Здесь возможен подход к решению этой проблемы или обходной путь (но он действителен, поскольку все изменения сделаны через API AppKit, без жесткого кодирования). На самом деле это то же самое, что и выключение флажка в XIB для scrollview, содержащего наше представление таблицы. Протестировано с Xcode 11.2 / macOS 10.15.

struct ScrollViewCleaner: NSViewRepresentable {

    func makeNSView(context: NSViewRepresentableContext<ScrollViewCleaner>) -> NSView {
        let nsView = NSView()
        DispatchQueue.main.async { // on next event nsView will be in view hierarchy
            if let scrollView = nsView.enclosingScrollView {
                scrollView.drawsBackground = false
            }
        }
        return nsView
    }

    func updateNSView(_ nsView: NSView, context: NSViewRepresentableContext<ScrollViewCleaner>) {
    }
}

extension View {
    func removingScrollViewBackground() -> some View {
        self.background(ScrollViewCleaner())
    }
}

struct TestListBackground: View {
    var body: some View {
            List()
            {
                ForEach(0..<3) { _ in
                    Text("Test")
                        .listRowBackground(Color.green)
                }
                .removingScrollViewBackground() // must be called _inside_ List
                .background(Color.blue)
            }.background(Color.red)
    }
}
2 голосов
/ 03 мая 2020

@ Ответ Аспери работает, но только до изменения размера окна. Вот еще один обходной путь для переопределения цвета List:

extension NSTableView {
  open override func viewDidMoveToWindow() {
    super.viewDidMoveToWindow()

    backgroundColor = NSColor.clear
    enclosingScrollView!.drawsBackground = false
  }
}

Потенциальным недостатком является то, что это повлияет на все списки в приложении.

1 голос
/ 28 февраля 2020

К сожалению, протокол ListStyle не документирован, а модификатор .listStyle имеет очень ограниченное использование, вы можете выбрать из CarouselListStyle, DefaultListStyle, GroupedListStyle ,PlainListStyle, SidebarListStyle

Попробуйте имитировать c Список с ScrollView в сочетании с ForEach, что дает У вас много гибкости, недостающие части легко написать. Как только ListStyle станет доступен для разработчиков, будет легко изменить код ...

Пример enter image description here с исходным кодом

struct ContentView: View {
    var body: some View {
        HStack(spacing: 0) {
            ScrollView {
                ForEach(0 ..< 4) { idx in
                    VStack(alignment: .leading) {
                        Divider().background(Color.blue)
                        Text("Test \(idx)")
                            .padding(.horizontal, 10)
                            .background(Color.pink)
                        //Divider()
                    }.padding(.bottom, -6)
                }
            }
                .frame(maxWidth: 100)
            .background(Color.gray)

            Color.green
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...