У меня есть следующий код, в котором содержимое моего SplashScreen плавно исчезает. Но кажется, что представление Color("app_color") исчезает быстрее, чем представление Image.
import SwiftUI
struct ContentView: View {
var body: some View {
ZStack {
TabbedView()
SplashScreen (duration: 2.0, delay: 2.0) {
SplashContents()
}
}
}
}
struct SplashContents: View {
var body: some View {
ZStack {
Color("app_color")
Image("app_logo")
.resizable()
.frame(width: 200, height: 200)
}
}
}
public struct SplashScreen<Content: View>: View {
@State private var showSplash = true
let duration: Double
let delay: Double
let content: Content
public init(duration: Double = 0, delay: Double = 0, @ViewBuilder contentProvider: () -> Content){
self.duration = duration
self.delay = delay
self.content = contentProvider()
}
public var body: some View {
content
.edgesIgnoringSafeArea(.all)
.opacity(showSplash ? 1 : 0)
.zIndex(0) //push this screen to the back
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
withAnimation(.easeOut(duration: duration)) {
showSplash = false
}
}
}
}
}
Результат можно увидеть в прикрепленном видео.
Таким образом, на видео вы можете видеть, что квадратное изображение отделено от красного фона, потому что кажется, что они исчезают с разной скоростью. Мой вопрос: как мне заставить представление «Цвет» исчезать с той же скоростью, что и представление «Изображение», чтобы оно выглядело так, как будто изображения и цветные изображения представляют собой один элемент?
Я думаю, дело не в том, что изображение исчезает медленнее, а в том, что они накладываются друг на друга. Вы можете думать об этом как о том, что красный цвет дважды присутствует в этой области изображения.
Один из способов рендеринга их вместе — использование модификатора compositingGroup()
.
ZStack {
Color("app_color")
Image("app_logo")
.resizable()
.frame(width: 200, height: 200)
}
.compositingGroup()
Группа компоновки заставляет эффекты компоновки в представлениях-предках этого представления, такие как непрозрачность и режим наложения, вступать в силу до того, как это представление будет визуализировано.
Используйте compositingGroup() для применения эффектов к родительскому представлению перед применением эффектов к этому представлению.
Более подробную информацию вы можете найти здесь.