After 3 months I finally found a solution which I would like to share with you. There are two steps you need to take to get it to work:
Make the animation explicit. That means: use .withAnimation{} instead of .animation().
Dispatch to main queue (DispatchQueue.main.async{}) before calling .withAnimation. I have no idea why this is needed.
There is an article by javier on swift-lab called "Advanced SwiftUI animations" that helped me a lot. (Unfortunately the forum doesn't allow me to add a link.)
Here is the working result:
import SwiftUI
struct ContentView: View {
@State private var isAnimating = false
var body: some View {
let animation = Animation
.linear
.repeatForever(autoreverses: false)
return Image(systemName: "iphone")
.rotationEffect(.degrees(isAnimating ? 360 : 0))
.onAppear {
DispatchQueue.main.async {
withAnimation(animation) {
isAnimating = true
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
ContentView()
.previewDisplayName("Working")
NavigationView {
ContentView()
}
.previewDisplayName("Now also working")
}
}
}