如何仅将动画应用于一个特定的修改器更改?

时间:2020-09-07 00:42:12

标签: swift macos swiftui

如何仅将.animation应用于.offset,同时保持其他修饰符更改不受其影响。在偏移量之后添加.animation也会使更改字体大小成为动画。

enter image description here

// Main view
var body: some View {
    GeometryReader { geo in
        VStack {
            DynamicText()
        }
        .frame(height: geo.size.height)
        .offset(y: self.viewModel.offset ? 5.0 : 0)
        .animation(.default)
    }
}

// DynamicText view
var body: some View {
    return GeometryReader { geo in
        VStack {
            Text("Foo")
                .font(
                    .system(size: geo.size.height * 0.95, weight: .regular, design: .monospaced))
                .minimumScaleFactor(0.05)
                .lineLimit(1)
                .foregroundColor(Color("primary"))
        }
        .frame(height: geo.size.height)
    }
}

还尝试将.animation(nil)用于上面的修饰符无意进行动画处理,但是,这也使偏移量无法动画处理。由于ZStack包含不同的条件渲染DynamicText,因此动画修改器还在内容更改之间应用了淡入淡出过渡,这是我要避免的事情。

// Main view
var body: some View {
    GeometryReader { geo in
        VStack {
            DynamicText()
        }
        .animation(nil)
        .frame(height: geo.size.height)
        .offset(y: self.viewModel.offset ? 5.0 : 0)
        .animation(.default)
    }
}

1 个答案:

答案 0 :(得分:2)

提供的快照不可测试,因此只是一个想法-尝试将动画限制为显式偏移值,例如

var body: some View {
    GeometryReader { geo in
        VStack {
            DynamicText()
        }
        .frame(height: geo.size.height)
        .offset(y: self.viewModel.offset ? 5.0 : 0)
        .animation(.default, value: self.viewModel.offset)     // << here !!
    }
}