SwiftUI: Как поместить разрыв строки в ForEach l oop, где он повторяет представление в нем - PullRequest
1 голос
/ 02 марта 2020

У меня есть динамическое представление c SwiftUI, где я передаю информацию через параметр. После этого я пытаюсь сделать копии вида, используя ForEach l oop. Представления отображаются как обычно вертикально в стеке. Тем не менее, я хотел бы представить все взгляды в трех разных строках. Может ли кто-нибудь представить эффективное решение?

Я хочу этот дизайн:

And I want this:

Но у меня есть это:

I have got this:

Мой код:

struct AllDaysView: View {
    @Binding var hasMenuShown: Bool
    var days: [String] = NextDaysView().days

    var body: some View {
        VStack {
            MenuBarView(hasMenuShown: $hasMenuShown)
            ForecastButtonsView()
            HStack {
                ForEach(days, id: \.self) { day in
                    SingleDaySummaryView(day: day)
                }
            }
            Spacer()
        }
    }
}

1 Ответ

0 голосов
/ 02 марта 2020

Сначала давайте разберем массив на группы по три.

extension Array {
    func dividedIntoGroups(of i: Int = 3) -> [[Element]] {
        var copy = self
        var res = [[Element]]()
        while copy.count > i {
            res.append( (0 ..< i).map { _ in copy.remove(at: 0) } )
        }
        res.append(copy)
        return res
    }
}

Изменим days var:

var days: [String] = NextDaysView().days.dividedIntoGroups(of: 3)

Теперь давайте создадим новый код для body:

VStack {
    MenuBarView(hasMenuShown: $hasMenuShown)
    ForecastButtonsView()
    ForEach(days, id: \.self) { dayRow in
        HStack {
            ForEach(dayRow, id: \.self) { day in
                SingleDaySummaryView(day: day)
            }
        }
    }
    Spacer()
}

В этом коде вы можете легко изменить количество просмотров в строке, но сделать его действительно динамичным c довольно сложно. Если вы хотите сделать это, вы можете использовать GeometryReader, чтобы получить ширину экрана, но для вычисления количества просмотров на строку вам, конечно, также понадобится ширина одного представления, и , что ' хитрый Эта статья может содержать информацию, которая может привести к решению: https://swiftui-lab.com/communicating-with-the-view-tree-part-1/

Я не мог действительно протестировать этот код, потому что я сейчас не работаю над моей Ma c , но, надеюсь, это сработает или, по крайней мере, поможет вам!

...