С новым 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
}
}





Просто используйте новый модификатор:
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 для бэкенда, поэтому обновленный обходной путь — изменить соответствующие цвета фона:
Основная часть:
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
}
//...
@Darren, смотрите обновления в комментариях
Спасибо. Жаль, что он использует то же самое, что и фон. Когда вы говорите о пользовательских разделителях, вы имеете в виду добавление фактической строки в представление каждой строки?
Да, они делают то же самое, на самом деле даже хуже, потому что добавление строки SwiftUI просто добавляет линию рисования в контекст, но Apple добавляет новый UIView для каждой строки-разделителя.
Новый .scrollContentBackground в бета-версии 3 заставляет все работать так, как ожидалось, без этого обходного пути и других цветовых разделителей.
Я думаю, что новая бета-версия не позволяет использовать scrollContentBackground напрямую с Style. Он должен быть установлен на .hidden, а затем составлен с помощью .background(style).
В iOS 16 добавлен новый модификатор scrollContentBackground (видимость) для настройки видимости фона для прокручиваемых представлений, включая List. Это было добавлено в бета-версии 3 (примечания к выпуску).
Вы можете скрыть стандартный фон системы, например, чтобы показать фон списка, если вы его предоставите:
List {
Text("One")
Text("Two")
Text("Three")
}
.background(Image("MyImage"))
.scrollContentBackground(.hidden)
Я использую бета-версию 4, и передача ей цвета, например .red вместо .hidden, дает «Невозможно преобразовать значение типа «Цвет» в ожидаемый тип аргумента «Видимость»».
@MarkVolkmann, о, интересно, кажется, они убрали возможность использовать цвет в бета-версии 4.
Для этой цели я создал собственный идентификатор, который скрывает этот пользовательский фон прокрутки.
struct ListBackgroundModifier: ViewModifier {
@ViewBuilder
func body(content: Content) -> some View {
if #available(iOS 16.0, *) {
content
.scrollContentBackground(.hidden)
} else {
content
}
}
}
Применение:
List {
...
}
.modifier(ListBackgroundModifier())
Да, если вы хотите, чтобы он имел одинаковый стиль во всем приложении. В моем такого не было.
Это очень помогло, хотя, когда я переопределяю геттер
backgroundColor, я теряю свойlistRowSeparatorTint(как видно на вашем изображении). Любая идея, как вернуть его?