【发布时间】:2020-10-11 18:21:41
【问题描述】:
我在视图中有一些文本,我希望这些文本改变它在计时器上的位置。我有以下内容:
struct AlphabetView: View {
@State var timer: Publishers.Autoconnect<Timer.TimerPublisher> = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
@State var refreshMe: Bool = false // this is a hack to refresh the view
var relativePositionX: CGFloat {
get { return CGFloat(Float.random(in: 0...1)) }
}
var relativePositionY: CGFloat {
get { return CGFloat(Float.random(in: 0...1)) }
}
var body: some View {
GeometryReader { geometry in
Text("Hello World!")
.position(x: geometry.size.width * self.relativePositionX, y: geometry.size.height * self.relativePositionY)
.onReceive(timer) { _ in
// a hack to refresh the view
self.refreshMe = !self.refreshMe
}
}
}
}
我认为每次 self.refreshMe 更改时都应该重新加载视图,因为它是@State。但我看到的是,只有在重新加载相关视图的父视图时,文本位置才会发生变化。我做错了什么(除了乱搞)?有没有更好的方法来做到这一点?
【问题讨论】:
-
您的 hack 不起作用,因为您的视图实际上并未使用
refreshMe。添加.foregroundColor(self.refreshMe ? .black : .black)之类的内容足以让 SwiftUI 触发更新。 -
顺便说一句,
CGFloat也有.random(in:),所以var relativePositionX: CGFloat { .random(in: 0...1) }就足够了。