Есть ли способ сохранить вид всегда видимым в ZStack в SwiftUI?

#swiftui

Вопрос:

У меня есть представление, которое я хотел бы полностью охватить в какой-то момент, и я бы хотел, чтобы только одно конкретное представление ребенка не было охвачено. Возможно ли это в SwiftUI?

См., например, этот код:

 import SwiftUI

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

struct ContentView: View {
    @State var showCover = false
    var body: some View {
        ZStack {
            VStack {
                Spacer()
                Text("Normal text")
                    .font(.headline)
                    .padding()
                Text("Text that should always be visible")
                    .font(.headline)
                    .padding()
                Spacer()
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .edgesIgnoringSafeArea(.all)

            if self.showCover {
                VStack {
                    Rectangle()
                        .fill(Color.blue)
                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                }
                .edgesIgnoringSafeArea(.all)
            }
        }
        .onAppear(perform: {
            DispatchQueue.main.asyncAfter(deadline: .now()   3) {
                self.showCover = true
            }
        })
    }
}
 

Есть ли способ сделать так, чтобы вторая Text была сверху обложки? Я попытался установить zindex на нем высокое значение, но это, похоже, не возымело эффекта.

Ответ №1:

Я думаю, что использование цвета переднего плана или скрытого-лучший способ, потому что, если вы убьете некоторые виды на экране, вы заметите некоторое смещение при просмотре, что неприятно для пользователя.


Версия 1:

 import SwiftUI

struct ContentView: View {
    
    @State var showCover: Bool = Bool()
    
    var body: some View {
        
        ZStack {
            
            if showCover { Color.blue }
            
            VStack {
                
                Spacer()
                
                Text("Normal text")
                    .foregroundColor(showCover ? Color.clear : Color.primary)
                    .padding()
                
                Text("Text that should always be visible")
                    .padding()
                
                Spacer()
            }
            
        }
        .font(.headline)
        .ignoresSafeArea()
        .onAppear() { DispatchQueue.main.asyncAfter(deadline: .now()   .seconds(3)) { showCover = true } }
        
    }
}
 

Версия 2:

 import SwiftUI

struct ContentView: View {
    
    @State var showCover: Bool = Bool()
    
    var body: some View {
        
        ZStack {
            
            if showCover { Color.blue }
            
            VStack {
                
                Spacer()
                
                if showCover { Text("Normal text").padding().hidden() }
                else { Text("Normal text").padding() }
                
                Text("Text that should always be visible")
                    .padding()
                
                Spacer()
            }
            
        }
        .font(.headline)
        .ignoresSafeArea()
        .onAppear() { DispatchQueue.main.asyncAfter(deadline: .now()   .seconds(3)) { showCover = true } }
        
    }
}
 

Комментарии:

1. Использование скрытого, по-видимому, действительно является хорошей заменой. Спасибо!