我有一个List显示两个Views相同类型的。当您点击其中一个视图时,它们会通过动画改变高度。
但是,List嵌入的这些视图不会动画,这会导致丑陋的故障,因为List行的高度会立即更改,而该行内的实际视图是动画的:
我怎样才能制作List动画?我尝试向其添加.animation修饰符,但这没有任何作用。
我也不想将tapGesture视图移出。视图应该是自包含的,而不是依赖其他视图来控制它(我认为这就是 MVVM 的意义所在)
谢谢!
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: …Run Code Online (Sandbox Code Playgroud) 我正在开发一个List可以扩展/收缩的 SwiftUI 单元,这是一个非常简单的东西,您可以在很多情况下看到。类似于以下内容(以下是在 中实现的UIKit):
老实说,我正在努力在 SwiftUI 上实现同样的功能。我尝试了几种方法:
1)第一种方法:有条件地包含单元格底部:
import SwiftUI
struct Approach1: View {
@State private var selectedIndex = -1
var body: some View {
List {
ForEach(0...20, id: \.self) { idx in
Cell(isExpanded: self.selectedIndex == idx)
.onTapGesture {
withAnimation {
self.selectedIndex = (self.selectedIndex == idx) ? -1 : idx
}
}
}
}
}
}
private struct Cell: View {
let isExpanded: Bool
var body: some View {
VStack(alignment: .leading) {
Text("Hello World")
.animation(nil)
if …Run Code Online (Sandbox Code Playgroud)