#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. Использование скрытого, по-видимому, действительно является хорошей заменой. Спасибо!