Ios SwiftUI-在动态筛选节时,防止节在列表中向右飞行/缩放

Ios SwiftUI-在动态筛选节时,防止节在列表中向右飞行/缩放,ios,swift,swiftui,swiftui-list,Ios,Swift,Swiftui,Swiftui List,我最初问这个问题: 在那里,我有一个没有章节的列表。我对它们进行了筛选,以便它只显示TextField中包含文本的行。解决方案是将列表中的所有内容包装在部分中 不幸的是,我现在需要过滤部分s。这是我的密码: struct Group: Identifiable { let id = UUID() /// required for the List var groupName = "" var people = [Person]() } st

我最初问这个问题:

在那里,我有一个没有章节的
列表。我对它们进行了筛选,以便它只显示
TextField
中包含文本的行。解决方案是将
列表中的所有内容包装在
部分中

不幸的是,我现在需要过滤
部分
s。这是我的密码:

struct Group: Identifiable {
    let id = UUID() /// required for the List
    
    var groupName = ""
    var people = [Person]()
}
struct Person: Identifiable {
    let id = UUID() /// required for the List
    
    var name = ""
}
struct ContentView: View {

    @State var searchText = ""

    var groups = [
        Group(groupName: "A People", people: [
            Person(name: "Alex"),
            Person(name: "Ally"),
            Person(name: "Allie")
        ]),
        Group(groupName: "B People", people: [
            Person(name: "Bob")
        ]),
        Group(groupName: "T People", people: [
            Person(name: "Tim"),
            Person(name: "Timothy")
        ])
    ]

    var body: some View {

        VStack {
            TextField("Search here", text: $searchText) /// text field
                .padding()
            
            List {
                ForEach(
                    
                    /// Filter the groups for those that contain searchText
                    groups.filter { group in
                        searchText.isEmpty || group.groupName.localizedStandardContains(searchText)
                    }
                    
                ) { group in
                    Section(header: Text(group.groupName)) {
                        ForEach(group.people) { person in
                            Text(person.name)
                        }
                    }
                    
                }
            }
            .animation(.default) /// apply the animation
        }
    }
}
结果:

我在
ForEach
中传入一个经过过滤的数组,以确定
部分。然而,每当数组发生变化时,
列表
的动画效果就非常奇怪。
部分将缩放/飞行到右侧,当数组再次包含它们时,从左侧返回如何避免此动画?


如果我删除
.animation(.default)
,它将不会像预期的那样设置动画。但是,我仍然想要一部动画。有没有办法使更改淡入淡出,或者将其滑动?

解决方案不使用列表。只要不使用选择和行删除,滚动视图基本上是相同的

如果您想让它的样式有点像列表,这也不难:

struct SearchAnimationExample:视图{
...
var body:一些观点{
VStack{
TextField(“在此处搜索”,text:$searchText)///文本字段
.padding()
滚动视图{
VStack(间距:0){
弗雷奇(
groups.filter{group in
searchText.isEmpty | | group.groupName.localizedStandardContains(searchText)
}
){中的组
节(标题:标题(标题:group.groupName)){
ForEach(group.people){
世界其他地区(适用于:人)
分隔器()
}
}
}.transition(.opacity)//设置您想要的转换
//始终为全宽
HStack{Spacer()}
}
}
.animation(.default)
}
}
func标题(标题:字符串)->某些视图{
HStack{
文本(标题)。字体(.headline)
垫片()
}
.padding(.卧式)
.背景(颜色.灰色.不透明度(0.4))
}
func行(用于个人:个人)->某些视图{
HStack{
文本(person.name)
垫片()
}.padding()
}
}
看起来几乎与默认列表相同:


@Yodagama我不会在任何地方应用
。转换
。。。列表在默认情况下会这样做吗?又一个swiftui bugAh不错!但是你不能应用列表样式,对吗?例如,
InsetGroupedListStyle
在iOS 13上似乎也没有动画。。。警告:ScrollView和HStack/VStack不重用视图,这可能会导致内存问题和延迟,因此我不建议将其作为数百行列表的替换。理想情况下,如果你想完全避免列表,你应该使用lazyhstack和lazyvstack(然而,不幸的是,它们只能从iOS 14上获得)。哦,iOS 13没有动画是很有趣的。从未见过这种情况发生。是的,没有列表样式。