Создайте свой собственный вид контейнера. Вы можете использовать @ViewBuilder
, чтобы заставить ваше представление вести себя как VStack
и HStack
, где требуется закрытие контента, полное подпредставлений.
Например, вот пользовательский контейнер, который дает основному контенту розовый фон и помещает панель инструментов под ним:
import SwiftUI
struct CustomContainer<Content: View>: View {
init(@ViewBuilder content: () -> Content) {
self.content = content()
}
let content: Content
var body: some View {
VStack(spacing: 0) {
content
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(hue: 0, saturation: 0.3, brightness: 1))
Toolbar()
}
}
}
struct Toolbar: View {
var body: some View {
HStack {
Spacer()
button("person.3.fill")
Spacer()
button("printer.fill")
Spacer()
button("heart.fill")
Spacer()
button("bubble.left.fill")
Spacer()
} //
.frame(height: 44)
}
private func button(_ name: String) -> some View {
Image(systemName: name)
.resizable()
.aspectRatio(contentMode: .fit)
.padding(4)
.frame(width: 40, height: 40)
}
}
И затем вот представление, которое использует это:
struct HelloView: View {
var body: some View {
CustomContainer {
VStack {
Text("hello")
Text("khawar")
}
}
}
}
import PlaygroundSupport
PlaygroundPage.current.setLiveView(HelloView())
Результат:
