Почему модификаторdgeIgnoringSafeArea применяется после окончания перехода в SwiftUI? - PullRequest
2 голосов
/ 08 ноября 2019

Я хочу наложить UIScreen с переходом непрозрачности. Это мое мнение:

struct ContentView: View {
    @State private var overlayUIScreen: Bool = false

    var body: some View {
        ZStack {
            if overlayUIScreen {
                Rectangle()
                    .edgesIgnoringSafeArea(.top)
                    .frame(width: UIScreen.main.bounds.size.width,
                           height: UIScreen.main.bounds.size.height)
                    .foregroundColor(Color.gray)

                    .transition(.opacity)
            }

            Button("Overlay?") {
                withAnimation {
                    self.overlayUIScreen.toggle()
                }
            }

        }
    }
}

Почему-то Безопасная зона меняет цвет после того, как переход уже завершен.
Почему это происходит и что я могу сделать, чтобы исправить это поведение?

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Другим решением будет перемещение рамки для изменения ZStack вместо Rectangle

struct ContentView: View {
    @State private var overlayUIScreen: Bool = false

    var body: some View {
        ZStack {
            if overlayUIScreen {
                Rectangle()
                    .edgesIgnoringSafeArea(.top)
                    .foregroundColor(Color.gray)
                    .transition(.opacity)
            }

            Button("Overlay?") {
                withAnimation {
                    self.overlayUIScreen.toggle()
                }
            }
        }
        .frame(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)
    }
}
0 голосов
/ 08 ноября 2019

Обходной путь может заключаться в том, чтобы уже иметь ваше представление в иерархии и приписать его непрозрачность частной переменной @State, например:

struct ContentView: View {
    @State private var overlayOpacity: Double = 0.0

    var body: some View {
        ZStack {

            Rectangle()
                 .edgesIgnoringSafeArea(.top)
                 .frame(width: UIScreen.main.bounds.size.width,
                        height: UIScreen.main.bounds.size.height)

                 .opacity(overlayOpacity)

                 .foregroundColor(Color.gray)

            Button("Overlay?") {
                withAnimation {
                    if self.overlayOpacity == 0.0 {
                        self.overlayOpacity = 1.0
                    } else {
                        self.overlayOpacity = 0.0
                    }
                }
            }

        }  .transition(.opacity)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...