给定 SwiftUI 中的列表,一旦开始平移,列表中 View 的更新似乎会暂停,直到滚动停止。有没有办法防止这种情况?
考虑以下代码:
class Model: ObservableObject, Identifiable {
@Published var offset: CGFloat = 0
let id = UUID()
private var timer: Timer!
init() {
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { _ in
self.update()
})
}
func update() {
offset = CGFloat.random(in: 0...300)
}
}
struct ContentView: View {
@ObservedObject var model1 = Model()
@ObservedObject var model2 = Model()
@ObservedObject var model3 = Model()
@ObservedObject var model4 = Model()
var body: some View {
List {
ForEach([model1, model2, model3, model4]) {
Rectangle()
.foregroundColor(.red)
.frame(width: $0.offset, height: 30, alignment: .center)
.animation(.default)
}
}
}
}
将导致这种行为:
最佳答案
这是由于 Timer
的性质所致和 RunLoop
.使用 GCD 代替,如下面的方法
init() {
var runner: (() -> ())?
runner = {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
if let self = self {
self.update()
runner?()
}
}
}
runner?()
}
关于SwiftUI 在滚动列表期间停止更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60988047/