Почему цветное представление исчезает быстрее, чем изображение в SwiftUI?

У меня есть следующий код, в котором содержимое моего 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
                    }
                }
            }
    }
}

Результат можно увидеть в прикрепленном видео.

Таким образом, на видео вы можете видеть, что квадратное изображение отделено от красного фона, потому что кажется, что они исчезают с разной скоростью. Мой вопрос: как мне заставить представление «Цвет» исчезать с той же скоростью, что и представление «Изображение», чтобы оно выглядело так, как будто изображения и цветные изображения представляют собой один элемент?

Animista - анимация на ходу!
Animista - анимация на ходу!
Если вы веб-дизайнер или разработчик, вы знаете, что добавление анимации на ваш сайт может помочь сделать его более привлекательным и динамичным....
Повысьте уровень своего сайта с помощью анимации CSS и JavaScript: Пошаговое руководство
Повысьте уровень своего сайта с помощью анимации CSS и JavaScript: Пошаговое руководство
Если вы хотите добавить визуальный интерес к своему сайту, то внедрение анимации с помощью CSS и JavaScript может стать отличным способом сделать это....
1
0
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Один из способов рендеринга их вместе — использование модификатора compositingGroup().

ZStack {
    Color("app_color")
    Image("app_logo")
        .resizable()
        .frame(width: 200, height: 200)
}
.compositingGroup()

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

Используйте compositingGroup() для применения эффектов к родительскому представлению перед применением эффектов к этому представлению.

Более подробную информацию вы можете найти здесь.

Другие вопросы по теме