繁体   English   中英

SwiftUI 4 - iOS 16:在星级视图中奇怪的 animation

[英]SwiftUI 4 - iOS 16: weird animation in a rating stars view

我正在使用以下代码片段来显示一个简单的星级评分视图:

struct ContentView: View {
    @State var rating: Float = 1.0
    
    var body: some View {
        HStack(spacing: 4) {
            ForEach (0 ..< filledStarsCount, id: \.self) { index in
                Button {
                    rating = Float(index + 1)
                    
                } label: {
                    Image(systemName: "star.fill")
                }
              
            }
            
            ForEach (0 ..< emptyStarsCount, id: \.self) { index in
                Button {
                    rating = Float(index + filledStarsCount + 1)
                    
                } label: {
                    Image(systemName: "star")
                }
               
            }
        }
        .font(.title)
    }

    var emptyStarsCount: Int {
        filledStarsCount == 5 ? 0 : abs(5 - filledStarsCount  )
    }
    
    var filledStarsCount: Int {
        let rounded = Int(rating)
        if rounded > 5 { 
            return 5
        }
        else {
            return rounded
        }
    }
}

但是每当我点击一个空星时,视图会在 iOS 16 中以一种奇怪的方式重绘,并在 iOS 15.5 中重新绘制(带有一点闪光),这是该问题的视频截图:

在此处输入图像描述

代码可以复制粘贴在 XCode 中试用。

奇怪的 animation 是因为您不应该使用具有动态范围的ForEach视图结构(它不是 for 循环),例如0..< filledStarsCount ,它必须是 static 数字,例如0..< 5 . 原因是在使用索引作为 ID 时它无法跟踪更改,因为如果说有 5 个项目并且索引 0 的项目被删除,那么仍然有一个索引为 0 的项目。一旦你明白你知道解决方案是始终创建 5 星位置并决定每个位置是否应具有填充图像,例如

ForEach (0 ..< 5) { index in
    Button {
       rating = Float(index + 1)
    } label: {
       Image(systemName: rating < index ? "star.fill" : "star" ) // needs tested 
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM