Фон списка SwiftUI для iOS 16

С новым SwiftUI обновлением в iOS 16 List больше не зависит от UITableView. Таким образом, следующий фрагмент, который мы использовали для установки цвета фона List на .clear, теперь бесполезен:

UITableView.appearance().backgroundColor = .clear

Я видел, что кто-то использовал introspect для решения проблемы, но кто-нибудь знает другой, может быть, более чистый способ добиться того же поведения?

Также обратите внимание, что на macOS отлично работает следующее (проверено с использованием Xcode 14 beta и macOS Ventura):

extension NSTableView {
    open override func viewDidMoveToWindow() {
        super.viewDidMoveToWindow()
        backgroundColor = NSColor.clear
        enclosingScrollView!.drawsBackground = false
    }
}
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
895
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

iOS 16

Обновление: Xcode 14b3+

Просто используйте новый модификатор:

    List {
        Text("Item 1")
        Text("Item 2")
        Text("Item 3")
    }
    .scrollContentBackground(Color.red)     // << here !!
//    .scrollContentBackground(Color.clear)     // << transparent !!
//    .scrollContentBackground(.hidden)     // << can be combined with above !!

Оригинал

Теперь они используют UICollectionView для бэкенда, поэтому обновленный обходной путь — изменить соответствующие цвета фона:

demo

Основная часть:

extension UICollectionReusableView {
    override open var backgroundColor: UIColor? {
        get { .clear }
        set { }

        // default separators use same color as background
        // so to have it same but new (say red) it can be
        // used as below, otherwise we just need custom separators
        // 
        // set { super.backgroundColor = .red }

    }
}

struct ContentView: View {
    init() {
        UICollectionView.appearance().backgroundColor = .clear
    }
//...

Тестовый модуль на GitHub

Это очень помогло, хотя, когда я переопределяю геттер backgroundColor, я теряю свой listRowSeparatorTint (как видно на вашем изображении). Любая идея, как вернуть его?

Darren 25.06.2022 19:22

@Darren, смотрите обновления в комментариях

Asperi 26.06.2022 13:38

Спасибо. Жаль, что он использует то же самое, что и фон. Когда вы говорите о пользовательских разделителях, вы имеете в виду добавление фактической строки в представление каждой строки?

Darren 26.06.2022 13:57

Да, они делают то же самое, на самом деле даже хуже, потому что добавление строки SwiftUI просто добавляет линию рисования в контекст, но Apple добавляет новый UIView для каждой строки-разделителя.

Asperi 26.06.2022 14:00

Новый .scrollContentBackground в бета-версии 3 заставляет все работать так, как ожидалось, без этого обходного пути и других цветовых разделителей.

Darren 07.07.2022 10:55

Я думаю, что новая бета-версия не позволяет использовать scrollContentBackground напрямую с Style. Он должен быть установлен на .hidden, а затем составлен с помощью .background(style).

Jay Lee 12.08.2022 18:04

В iOS 16 добавлен новый модификатор scrollContentBackground (видимость) для настройки видимости фона для прокручиваемых представлений, включая List. Это было добавлено в бета-версии 3 (примечания к выпуску).

Вы можете скрыть стандартный фон системы, например, чтобы показать фон списка, если вы его предоставите:

List {
    Text("One")
    Text("Two")
    Text("Three")
}
.background(Image("MyImage"))
.scrollContentBackground(.hidden)

Я использую бета-версию 4, и передача ей цвета, например .red вместо .hidden, дает «Невозможно преобразовать значение типа «Цвет» в ожидаемый тип аргумента «Видимость»».

Mark Volkmann 01.08.2022 01:53

@MarkVolkmann, о, интересно, кажется, они убрали возможность использовать цвет в бета-версии 4.

Jordan H 01.08.2022 02:04

Для этой цели я создал собственный идентификатор, который скрывает этот пользовательский фон прокрутки.

struct ListBackgroundModifier: ViewModifier {

    @ViewBuilder
    func body(content: Content) -> some View {
        if #available(iOS 16.0, *) {
            content
                .scrollContentBackground(.hidden)
        } else {
            content
        }
    }
}

Применение:

List {
    ...
}
.modifier(ListBackgroundModifier())

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

Marian König 20.07.2022 13:29

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