在@Chris'的帮助下,我实现了如下工作:
import SwiftUI
struct IntroView: View {
@Binding var isPresented: Bool
var introType: IntroType
var body: some View {
if (introType == .Main) {
getContentMain()
}
else if (introType == .SA) {
getContentSA()
}
else if (introType == .Journey) {
getContentJourney()
}
}
}
fileprivate struct IntroTabView<Content: View>: View {
let content: Content
@Binding var isPresented: Bool
@State var activeSlide: Int = 0
let slideAmount: Int
init(isPresented: Binding<Bool>, slideAmount: Int, @ViewBuilder content: () -> Content) {
self._isPresented = isPresented
self.slideAmount = slideAmount
self.content = content()
}
var body: some View {
ZStack(alignment: .bottom) {
Color.darkGalaxy
TabView(selection: $activeSlide) {
self.content
}
.tabViewStyle(PageTabViewStyle())
.indexViewStyle(.page(backgroundDisplayMode: .always))
// Buttons
HStack { ... }
.padding(16)
}
}
}
// Static content blocks for each type
fileprivate extension IntroView {
private func getContentMain() -> some View {
IntroTabView(isPresented: $isPresented, slideAmount: 3) {
MainIntroSlide1().tag(0)
TextSlide(headline: "Headline", text: "Text").tag(1)
TextSlide(headline: "Headline2", text: "Text2").tag(2)
}
}
private func getContentSA() -> some View {
IntroTabView(isPresented: $isPresented, slideAmount: 2) {
TextSlide(headline: "Headline", text: "Text").tag(0)
TextSlide(headline: "Headline2", text: "Text2").tag(1)
}
}
private func getContentJourney() -> some View {
IntroTabView(isPresented: $isPresented, slideAmount: 1) {
TextSlide(headline: "Headline", text: "Text").tag(0)
}
}
}
enum IntroType: String {
case Main, SA, Journey
}
struct IntroView_Previews: PreviewProvider {
static var previews: some View {
IntroView(isPresented: .constant(true), introType: .Main)
}
}
这是一个不错的景观: