Контент ScrollView не заполняется в SwiftUI - PullRequest
3 голосов
/ 09 июня 2019

У меня есть прокрутка, содержимое которой представляет собой VStack, содержащее цикл ForEach для создания нескольких строк вместо списка. Список имеет некоторые недостатки, такие как разделители.

Моя проблема в том, что строка не заполняет вид прокрутки. Я думаю, что ширина прокрутки не заполняет экран.

NavigationView {
        Toggle(isOn: $onlineStatus) {
            Text("Online Only")
        }.padding([.leading, .trailing], 15)

        ScrollView {
            VStack(alignment: .trailing) {
                ForEach(onlineStatus ? self.notes.filter { $0.dot == .green } : self.notes) { note in
                    NavigationButton(destination: Text("LOL")) {
                        CardRow(note: note)
                            .foregroundColor(.primary)
                            .cornerRadius(8)
                            .shadow(color: .gray, radius: 3, x: 0, y: -0.01)
                    }.padding([.leading, .trailing, .top], 5)
                }.animation(self.onlineStatus ? .fluidSpring() : nil)
            }
        }.padding([.leading, .trailing])

        .navigationBarTitle(Text("Your documents"))
    }

Это дает мне такой результат:

enter image description here

Это мой CardRow:

struct CardRow: View {
var note: Note

var body: some View {
    HStack {
        Image(uiImage: UIImage(named: "writing.png")!)
            .padding(.leading, 10)

        VStack(alignment: .leading) {
            Group {
                Text(note.message)
                    .font(.headline)
                Text(note.date)
                    .font(.subheadline)
            }
            .foregroundColor(.black)
        }

        Spacer()
        VStack(alignment: .trailing) {
            Circle().foregroundColor(note.dot)
                .frame(width: 7, height: 7)
                .shadow(radius: 1)
                .padding(.trailing, 5)
            Spacer()
        }.padding(.top, 5)
    }
    .frame(height: 60)
    .background(Color(red: 237/255, green: 239/255, blue: 241/255))
}

}

Ответы [ 3 ]

1 голос
/ 09 июня 2019

Попробуйте установить ширину кадра RowView в UIScreen.main.bounds.width: .frame(width: UIScreen.main.bounds.width)

1 голос
/ 09 июня 2019

Используйте .frame(minWidth: 0, maxWidth: .infinity) в RowView или внутри него

0 голосов
/ 15 июня 2019

Лучшее решение, которое я нашел, это использовать GeometryReader, чтобы заполнить содержимое ScrollView до ширины внешнего вида.И обязательно используйте Spacer () в HStack каждого ряда.Это хорошо обрабатывает безопасные области и вращение.

struct Card : View {
    var body: some View {
        HStack {
            VStack(alignment: .leading) {
                Text("Header")
                    .font(.headline)
                Text("Description")
                    .font(.body)
            }
            Spacer()
        }
            .padding()
            .background(Color.white)
            .cornerRadius(8)
            .shadow(color: Color.black.opacity(0.15), radius: 8, x: 0, y: 0)
    }
}

struct Home : View {
    var body: some View {
        GeometryReader { geometry in
            NavigationView {
                ScrollView {
                    VStack(alignment: .leading, spacing: 16) {
                        Card()
                        Card()
                        Card()
                    }
                        .padding()
                        .frame(width: geometry.size.width)
                }
                    .navigationBarTitle(Text("Home"))
            }
        }
    }
}

Смотрите полученный скриншот здесь.

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