SwiftUI - Animations triggered inside a View that's in a list doesn't animate the list as well
The solution is just to make height animatable continuously, by providing explicit animatable modifier for this.
Here is working approach. Tested with Xcode 11.4 / iOS 13.4.
Implementation of simple helper modifier
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)
}
}
Modified using view (other parts unchanged)
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()
}
}
}
}