Этот удивительный вопрос был закрыт из-за «отсутствия технических подробностей», поэтому я обязательно положите сюда побольше.

Настройка:

  1. Создайте приложение iOS SwiftUI
  2. Добавьте файлы следующим образом
  3. Наблюдайте за проблемой

AppleApp.swift

import SwiftUI

@main
struct AppleApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

< Сильный > ContentView.swift

import SwiftUI

struct ContentView: View {
    @State var isLocked = true

    var body: some View {
        VStack {
            Text("Unlocked view")
                .padding()
        }.fullScreenCover(isPresented: $isLocked) {

        } content: {
            LockScreen($isLocked)
        }


    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

LockScreen.swift

import SwiftUI

struct LockScreen: View {
    @Binding var isLocked: Bool

    init(_ isLocked: Binding<Bool>) {
        self._isLocked = isLocked
    }

    var body: some View {
        ZStack {
            Color.gray
            VStack {
                Text("Locked")
                Button("Unlock") {
                    print("unlock button pressed")
                    isLocked = false
                }
            }
        }
    }
}

struct LockScreen_Previews: PreviewProvider {
    @State static var isLocked: Bool = true
    static var previews: some View {
        LockScreen($isLocked)
    }
}

Проблема:

Посмотрите видео: после запуска приложения виден «разблокированный вид», а после небольшой задержки появляется «LockScreen» с анимацией.

Желаемый результат:

Приложение показывает «LockScreen» сразу после запуска, но его можно отключить, нажав кнопку «разблокировать».

Видео проблемы

Файл проекта с примером приложения

1
Richard Topchii 26 Ноя 2021 в 13:38
Отвечает ли это на ваш вопрос? SwiftUI удаляет переход полноэкранного покрытия
 – 
Raja Kishan
26 Ноя 2021 в 13:44
Вовсе нет, так как он просто задерживает время начала перехода.
 – 
Richard Topchii
26 Ноя 2021 в 13:45
Просто попробовал ваш код по-своему, работает нормально. .onAppear() { withoutAnimation { isLocked = true } } просто добавил это и изначально установил false для isLocked
 – 
Raja Kishan
26 Ноя 2021 в 13:53
Вам нужен FullScreenCover? У меня другой подход, который, возможно, вам понравится больше. И он всегда будет сначала показывать белый экран, пока вы не добавите заставку в свой проект.
 – 
Alexander Thoren
26 Ноя 2021 в 14:12
Отвечает ли это на ваш вопрос stackoverflow.com/a/69717515/12299030?
 – 
Asperi
26 Ноя 2021 в 14:49

2 ответа

Лучший ответ

Надеюсь, вы найдете это полезным. Я знаю, что у него нет FullScreenCover, но он сразу это покажет.

import SwiftUI

struct ContentView: View {
    @State var isLocked = true
    
    var body: some View {
        if self.isLocked {
            LockScreen(isLocked: self.$isLocked)
        } else {
            VStack {
                Text("Unlocked view")
                    .padding()
            }
        }
    }
}

struct LockScreen: View {
    @Binding var isLocked: Bool
    
    var body: some View {
        ZStack {
            Color.gray
            VStack {
                Text("Locked")
                Button("Unlock") {
                    print("unlock button pressed")
                    isLocked = false
                }
            }
        }
        .ignoresSafeArea()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
2
Alexander Thoren 26 Ноя 2021 в 14:13
Я закончил с аналогичным решением. Это настолько хорошо, насколько это вообще возможно, за исключением того, что при разблокировке нет анимации «скольжения вниз», которую я бы хотел иметь.
 – 
Richard Topchii
26 Ноя 2021 в 14:59

На основе вашего комментария к ответу @AlexanderThoren. Я добавил анимацию, а также упростил код.

Добавьте анимацию перехода.

Добавьте это расширение, чтобы скрыть - показать вид.

extension View {
    func showLockView(isLocked: Binding<Bool>) -> some View {
        ZStack {
            self
            if isLocked.wrappedValue {
                LockScreen(isLocked: isLocked).animation(.default).transition(AnyTransition.move(edge: .bottom))
            }
        }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
    }
}

И используйте его с просмотром контента

struct ContentView: View {
    @State var isLocked = true
    
    var body: some View {
        VStack {
            Text("Unlocked view")
                .padding()
        }
        .showLockView(isLocked: $isLocked) // << Here
    }
}
1
Raja Kishan 26 Ноя 2021 в 15:53
Не могли бы вы переписать свой код, чтобы не было расширения? Спасибо.
 – 
Richard Topchii
26 Ноя 2021 в 16:12
1
Ну, лучше использовать расширение, или вы можете проверить мой код перед редактированием. Только что получил отредактированную историю.
 – 
Raja Kishan
26 Ноя 2021 в 16:14