SwiftUI iOS14 - NavigationView + List - не заполняет пространство

У меня возникли проблемы со списком внутри NavigationView после обновления iOS 14.

Вот простая разбивка кода - я выделил все, что не указывает на проблему.

struct ContentView: View {
    
    var views = ["Line 1", "Line 2", "Line 3"]
    
    var body: some View {
        
        NavigationView {
            
            VStack {
                
                List {
                    
                    ForEach(views, id: \.self) { view in
                       
                        VStack {
                        Text("\(view)")
                        }
                        .background(Color.red)
                        
                    }
                    
                }
                
            }
            
        }
        
    }
}

Это дает следующий результат:

список внутри навигации

Я не могу понять, почему список так зависает в центре навигационного представления. Насколько я могу судить, это должно создать список, занимающий все доступное пространство (за исключением верхней части, где будет панель навигации).

Действительно, при запуске на iOS 13.5 я получаю такой результат, как на картинке ниже:

список в режиме навигации 2

Я прочитал документацию, но не могу понять, почему такое поведение внезапно возникает.

Любая помощь будет принята с благодарностью.

Спасибо


person swift--help    schedule 17.09.2020    source источник
comment
Я потратил один день на устранение неполадок. Спасибо за ваш вопрос   -  person Dennis Concepción Martín    schedule 31.12.2020


Ответы (1)


Проблема

Похоже, что стили по умолчанию List или NavigationView в iOS 14 могут в некоторых случаях отличаться от стилей в iOS 13.

Решение №1 - явный listStyle

Это уже не всегда PlainListStyle (как в iOS 13), но иногда и InsetGroupedListStyle.

Вам необходимо явно указать listStyle на PlainListStyle:

.listStyle(PlainListStyle())

Пример:

struct ContentView: View {
    var views = ["Line 1", "Line 2", "Line 3"]

    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(views, id: \.self) { view in
                        VStack {
                            Text("\(view)")
                        }
                        .background(Color.red)
                    }
                }
                .listStyle(PlainListStyle()) // <- add here
            }
        }
    }
}

Решение №2 - явный navigationViewStyle

Похоже, что стиль NavigationView по умолчанию иногда может быть DoubleColumnNavigationViewStyle (даже на iPhone).

Вы можете попробовать установить navigationViewStyle на StackNavigationViewStyle (как в iOS 13):

.navigationViewStyle(StackNavigationViewStyle())

Пример:

struct ContentView: View {
    var views = ["Line 1", "Line 2", "Line 3"]

    var body: some View {
        NavigationView {
            VStack {
                List {
                    ForEach(views, id: \.self) { view in
                        VStack {
                            Text("\(view)")
                        }
                        .background(Color.red)
                    }
                }
            }
        }
        .navigationViewStyle(StackNavigationViewStyle()) // <- add here
    }
}
person pawello2222    schedule 17.09.2020
comment
Привет спасибо за это Я не пытаюсь скрыть панель навигации. На самом деле проблема вовсе не в панели навигации. Моя проблема в том, что список должен занимать все доступное место на экране. Но на iOS14 он занимает лишь небольшую центральную часть, как показано на рисунке выше. Я считаю, что список должен заполнять вид как по горизонтали, так и по вертикали на основе приведенного выше кода (и это происходит в ios 13.5). - person swift--help; 17.09.2020
comment
Я обновил свой вопрос, добавив больше изображений для объяснения. Еще раз спасибо всем за помощь - person swift--help; 17.09.2020
comment
@ swift - help Спасибо, это из-за VStack. Я обновил свой ответ. - person pawello2222; 17.09.2020
comment
Это действительно дает желаемый эффект. Однако, если бы мне нужно было что-то еще над списком, например панель поиска, она охватила бы весь список без Vstack для их разделения, не так ли? - person swift--help; 17.09.2020
comment
@ swift - help О, теперь я понимаю, чего вы хотите - см. обновленный ответ. - person pawello2222; 17.09.2020
comment
Вы волшебник! Вот чего мне не хватало. Извините, я забил вопрос! Хорошего дня! - person swift--help; 17.09.2020
comment
В моем проекте вставка возникает только при использовании ForEach внутри List. Простое использование List + .listStyle(PlainListStyle()) не показывает вставку. Кто-нибудь может это подтвердить? - person koen; 21.09.2020
comment
@koen В приведенном выше примере, когда они заключены в VStack, как List, так и List+ForEach имеют вставки. Только удаление VStack или установка .listStyle явно удаляют вставки. К сожалению, это плохо документировано (пока?), Когда InsetGroupedListStyle является стилем по умолчанию. - person pawello2222; 21.09.2020
comment
@ pawello2222 Хм, у меня есть VStack с (custom) SearchBarView и List, по умолчанию listStyle, и он не показывает вставку. Может быть, дополнительный вид имеет какое-то отношение к этому. В любом случае, спасибо за указатель на использование PlainListStyle(). - person koen; 21.09.2020
comment
Большое спасибо за .listStyle (PlainListStyle ()) - person Abhishek Thapliyal; 18.03.2021
comment
.navigationViewStyle (StackNavigationViewStyle ()) - ›Работал у меня Tnx :) - person Threadripper; 23.06.2021