我有一个List显示两个Views相同类型的。当您点击其中一个视图时,它们会通过动画改变其高度。
List
Views
但是,List这些视图嵌入的对象没有动画,这会导致丑陋的毛刺,因为该List行的高度会立即更改,而该行中的实际视图则具有动画效果:
我也该如何制作List动画?我尝试在其中添加.animation修饰符,但没有任何作用。
.animation
我也不想将其tapGesture移出视图。该视图应该是独立的,不应依赖其他视图来控制它(我认为这就是MVVM的目的)
tapGesture
谢谢!
import SwiftUI struct SubView: View { @State var change: Bool = false var body: some View { Rectangle() .frame(width: 200, height: change ? 300 : 200) .foregroundColor(Color.red) .onTapGesture { withAnimation { self.change.toggle() } } } } struct Test: View { var body: some View { List { SubView() SubView() } } } struct Test_Previews: PreviewProvider { static var previews: some View { Test() } }
解决方案是通过为此提供明确的可动画修改器,使高度连续可动画化。
这是工作方法。已通过Xcode 11.4 / iOS 13.4测试。
简单助手修改器的实现
struct AnimatingCellHeight: AnimatableModifier { var height: CGFloat = 0 var animatableData: CGFloat { get { height } set { height = newValue } } func body(content: Content) -> some View { content.frame(height: height) } }
使用视图修改(其他部分不变)
struct SubView: View { @State var change: Bool = false var body: some View { Rectangle() .frame(width: 200) .modifier(AnimatingCellHeight(height: change ? 300 : 200)) .foregroundColor(Color.red) .onTapGesture { withAnimation { self.change.toggle() } } } }