iOS 16.4下SwiftUI可展开列表动画失效,求问题原因及解决方向
SwiftUI可展开列表iOS 16.4+动画失效问题
我参考教程实现了SwiftUI可展开列表,具体代码如下:
struct ContentView: View { var movies: [Movie] var body: some View { List(movies, children: \.movies) { movie in Text(movie.title) } } } struct Movie: Identifiable { let id: String let title: String var movies: [Movie]? }
该列表在iOS 16.1上的动画表现正常:
但自iOS 16.4版本起动画失效:
请问这是系统层面的Bug还是需要更换实现技术?
问题分析与解决方案
这是iOS 16.4及后续版本中List原生展开功能的已知系统Bug,苹果在部分iOS 16.x小版本更新中引入了这个动画异常问题。
如果需要恢复展开/收起的动画效果,建议改用手动实现可展开列表的方式,核心思路是通过绑定的布尔值控制子列表的显示状态,配合withAnimation确保动画生效:
手动实现示例代码
struct ContentView: View { var movies: [Movie] var body: some View { List(movies) { movie in ExpandableRow(movie: movie) } } } struct ExpandableRow: View { let movie: Movie @State private var isExpanded = false var body: some View { VStack(alignment: .leading, spacing: 0) { Button(action: { withAnimation { isExpanded.toggle() } }) { HStack { Text(movie.title) Spacer() Image(systemName: isExpanded ? "chevron.down" : "chevron.right") .font(.caption) } .padding(.vertical, 8) } if isExpanded, let children = movie.movies { ForEach(children) { childMovie in ExpandableRow(movie: childMovie) .padding(.leading, 20) } } } } } struct Movie: Identifiable { let id: String let title: String var movies: [Movie]? }
这种手动实现的方式不受系统Bug影响,能稳定保留展开/收起的过渡动画,同时还支持自定义行样式、动画曲线等扩展需求。
内容的提问来源于stack exchange,提问作者nelson PARRILLA
相关产品推荐
相关产品推荐

