Список SwiftUI с помощью NavigationLink. Как изменить цвет подсветки при нажатии? - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть список с NavigationLink внутри. Когда я нажимаю на строку, она подсвечивается. Цвет, связанный со стилем интерфейса пользователя (в info.plist), может быть темным или светлым. Как изменить цвет этой подсветки? Я основал некоторые решения здесь, с "EpmtyView ()" и ".buttonStyle ()", но они не работают в моем случае. При использовании пользовательского стиля кнопки выделяется только содержимое ячейки (например, текст), но не сама ячейка. Я думаю, что проблема, связанная с «selectionStyle», приводит к тому, что UITableViewCell.appearance (). SelectionStyle = .none »удаляет эту подсветку.

struct ContentView: View {
    var myArray = ["one", "two", "three"]

    init() {
         UITableView.appearance().backgroundColor = UIColor.clear
    }

    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(self.myArray, id: \.self) { text in
                        NavigationLink(destination: DestinationView()) {
                            MyRow(text: text)
                        }
                        .listRowBackground(Color.black)
                    }
                }.listStyle(GroupedListStyle())
            }.background(Color.black)
        }
    }
}
extension UINavigationController {
    override open func viewDidLoad() {
        super.viewDidLoad()
        let standartAppearance = UINavigationBarAppearance()
        standartAppearance.backgroundColor = UIColor.black
        navigationBar.standardAppearance = standartAppearance
        navigationBar.scrollEdgeAppearance = standartAppearance
        navigationBar.compactAppearance = standartAppearance
    }
}

row highlight

1 Ответ

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

Здесь возможен подход

Идея состоит в том, чтобы отключить стандартный стиль выделения и сделать вид фона строки с анимируемым списком в зависимости от выбранного тега навигационной ссылки.

enter image description here

Смотрите измененную часть вашего кода ниже ...

init() {
    UITableView.appearance().backgroundColor = UIColor.clear
    UITableViewCell.appearance().selectionStyle = .none
}

@State private var selection: Int? = nil
var body: some View {
    NavigationView {
        VStack {
            List {
                ForEach(Array(self.myArray.enumerated()), id: \.1.self) { (i, text) in
                    NavigationLink(destination: DestinationView(), tag: i, selection: self.$selection) {
                        MyRow(text: text)
                    }
                    .onTapGesture {
                        withAnimation {
                            self.selection = i
                        }
                    }
                    .listRowBackground(self.selection == i ? Color.yellow : Color.black)
                }
            }.listStyle(GroupedListStyle())
        }.background(Color.black)
    }
}
...