How to apply animation for one specific modifier change only?
The provided snapshot is not testable, so just a thought - try to limit animation to offset value explicitly, like
var body: some View {
GeometryReader { geo in
VStack {
DynamicText()
}
.frame(height: geo.size.height)
.offset(y: self.viewModel.offset ? 5.0 : 0)
.animation(.default, value: self.viewModel.offset) // << here !!
}
}
How to add a modifier to any specific buttons inside a ForEach loop for an array of buttons in SwiftUI?
import SwiftUI
struct AnimatedListView: View {
var body: some View {
VStack{
ForEach(0..<5) { num in
//The content of the ForEach goes into its own View
AnimatedButtonView(num: num)
}
}
}
}
struct AnimatedButtonView: View {
//This creates an @State for each element of the ForEach
@State private var rotationDegree = 0.0
//Pass the loops data as a parameter
let num: Int
var body: some View {
Button {
withAnimation {
rotationDegree += 360
}
} label: {
Image(systemName: "person")
Text(num.description)
}
.rotation3DEffect((.degrees(rotationDegree)), axis: (x: 0, y: 1, z: 0))
}
}
struct AnimatedListView_Previews: PreviewProvider {
static var previews: some View {
AnimatedListView()
}
}
SwiftUI animation not working using animation(_:value:)
The difference between animation(_:)
and animation(_:value:)
is straightforward. The former is implicit, and the latter explicit. The implicit nature of animation(_:)
meant that anytime ANYTHING changed, it would react. The other issue it had was trying to guess what you wanted to animate. As a result, this could be erratic and unexpected. There were some other issues, so Apple has simply deprecated it.
animation(_:value:)
is an explicit animation. It will only trigger when the value you give it changes. This means you can't just stick it on a view and expect the view to animate when it appears. You need to change the value in an .onAppear()
or use some value that naturally changes when a view appears to trigger the animation. You also need to have some modifier specifically react to the changed value.
struct ContentView: View {
@State var isOn = false
//The better route is to have a separate variable to control the animations
// This prevents unpleasant side-effects.
@State private var animate = false
var body: some View {
VStack {
Text("I don't change.")
.padding()
Button("Press me, I do change") {
isOn.toggle()
animate = false
// Because .opacity is animated, we need to switch it
// back so the button shows.
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
animate = true
}
}
// In this case I chose to animate .opacity
.opacity(animate ? 1 : 0)
.animation(.easeIn, value: animate)
.frame(width: 300, height: 400)
// If you want the button to animate when the view appears, you need to change the value
.onAppear { animate = true }
}
}
}
How to animate/transition text value change in SwiftUI
So it turns out this is really easy
Text(textValue)
.font(.largeTitle)
.frame(width: 200, height: 200)
.transition(.opacity)
.id("MyTitleComponent" + textValue)
Note the additional id
at the end. SwiftUI uses this to decide if it's dealing with the same view or not when doing a redraw. If the id is different then it assumes the previous view was removed and this one has been added. Because it's adding a new view it applies the specified transition as expected.
NB: It's quite possible that this id should be unique for the entire view tree so you probably want to take care to namespace it accordingly (hence the MyTitleComponent
prefix in the example).
Related Topics
Swiftui Classes That Conforms Observableobject Should Be Singleton
Use Background Image on Uisearchcontroller iOS 11
How to Restore Window Position in an Osx Application
Swift Build Time Too Long When the Configuration Is 'Release'
How to Prevent Multiple Instances of the Same Window from Opening in MACos
How to Add a Loading View for Apple Watch
How to Check If Dark Appearance Is Enabled Tvos
Passing Property Type as Parameter
How to Call a Selector-Based Timer Method on a Swift Struct
How to Compare Cgpoints in Swift
Delay a Repeating Animation in Swiftui with Between Full Autoreverse Repeat Cycles
Cast Cgfloat to Int in Extension Binaryfloatingpoint
Override Multiple Overloaded Init() Methods in Swift
How to Create a Hotspot Network in iOS App Using Swift
Swiftui Navigation: How to Switch Detail View to a Different Item