影响其他视图的 SwiftUI 动画

Posted

技术标签:

【中文标题】影响其他视图的 SwiftUI 动画【英文标题】:SwiftUI animation affecting other views 【发布时间】:2020-07-04 13:35:44 【问题描述】:

这是我的观点:

struct HomeView: View 
    @ObservedObject var instance = Instance()
    @State var dotColor = Color.gray
    var repeatingAnimation: Animation 
            Animation
                .easeInOut(duration: 1.0)
                .repeatForever()
        
    var body: some View 
        ZStack 
            TabView(selection: $selectedTab) 
                Settings(auth: auth)
                .tabItem 
                        Image(systemName: "gear")
                    Text("Settings")
    
                .tag(0)
                ZStack 
                    MapView(locationManager: locationManager)
                    Color.black.opacity(self.instance.status.opacity)
                    VStack 
                        Spacer()
                        Button(action: 
                            print("clicked")
                            withAnimation(self.repeatingAnimation) 
                                                self.dotColor = Color.white
                                            
                            self.instance.changeStatus()
                        )
                            HStack 
                                Text(self.instance.status.text)
                                    .font(.system(size: 24))
                                    .fontWeight(.bold)
                                    .foregroundColor(Color.white)
                                Circle().frame(width: 12, height: 12)
                                    .foregroundColor(self.dotColor)
                                    .colorMultiply(self.dotColor)
                                    .overlay(
                                        Circle()
                                            .stroke(Color.black, lineWidth: 1)
                                    )
                                
                            
                        .padding()

我的动画,每秒将Circle() 的颜色从gray 更改为white。但是,它也会每秒更改我的 ZStack 颜色不透明度 (Color.black.opacity(self.instance.status.opacity)) - 即使它与我的动画无关。

如果我删除动画,ZStack 不透明度不会出现这种奇怪的行为。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您可以显式禁用某些修饰符的动画,例如

Color.black.opacity(self.instance.status.opacity)
  .animation(nil)

【讨论】:

以上是关于影响其他视图的 SwiftUI 动画的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 动画如何与子视图隔离?

SwiftUI 动画滑入和滑出

Choppy Animation SwiftUI 嵌套视图

SwiftUI Segmented Control 在视图刷新时选择段文本动画

在动画偏移时动画删除/添加 SwiftUI 视图

从 UIKit 调整 SwiftUI 组件