| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import SwiftUI
- /// Keeps the static system launch screen visually continuous, then presents
- /// the selected 星痕 brand artwork before revealing the app.
- struct LaunchRootView: View {
- @State private var isShowingSplash = true
- var body: some View {
- ZStack {
- ContentView()
- if isShowingSplash {
- SplashView {
- withAnimation(.easeInOut(duration: 0.45)) {
- isShowingSplash = false
- }
- }
- .transition(.opacity)
- .zIndex(1)
- }
- }
- }
- }
- struct SplashView: View {
- @Environment(\.accessibilityReduceMotion) private var reduceMotion
- @State private var artworkOpacity = 0.0
- @State private var artworkScale = 1.008
- @State private var hasStarted = false
- let onFinished: () -> Void
- var body: some View {
- ZStack {
- Color("LaunchBackground")
- .ignoresSafeArea()
- Image("SplashArtwork")
- .resizable()
- .scaledToFill()
- .frame(maxWidth: .infinity, maxHeight: .infinity)
- .clipped()
- .opacity(artworkOpacity)
- .scaleEffect(artworkScale)
- .ignoresSafeArea()
- }
- .statusBarHidden(true)
- .task {
- guard !hasStarted else { return }
- hasStarted = true
- await playEntrance()
- }
- .accessibilityElement(children: .ignore)
- .accessibilityLabel("星痕。倾听,然后深刻。纯粹星辰出品。")
- }
- @MainActor
- private func playEntrance() async {
- if reduceMotion {
- artworkOpacity = 1
- artworkScale = 1
- try? await Task.sleep(for: .seconds(1.2))
- onFinished()
- return
- }
- withAnimation(.easeOut(duration: 0.65)) {
- artworkOpacity = 1
- artworkScale = 1
- }
- let holdDuration: Duration = ProcessInfo.processInfo.environment["XINGHEN_SPLASH_QA"] == "1"
- ? .seconds(30)
- : .seconds(2.05)
- try? await Task.sleep(for: holdDuration)
- onFinished()
- }
- }
- #Preview("星痕开屏") {
- SplashView(onFinished: {})
- }
|