Hi. My view gets animated with a call frmo a block of code withAnimation.{ }
how can i place this inside the view so that the binding variable will be the one to trigger the animation. Same as how sheets work.
THis is my sample view
import SwiftUI
struct GradientLegendView: View {
@Binding var isShowingLegend: Bool
var labels: [String]?
var colors: [Color]?
var width: Float
var height: Float
var viewRect = Rectangle()
var body: some View {
if isShowingLegend {
HStack {
VStack {
if let labels {
ForEach(labels, id:\.self) { label in
Text(label)
.frame(maxWidth: .infinity, alignment: .leading)
.font(.system(size: 14))
.foregroundColor(.black)
.backgroundStyle(.red)
.padding(0)
if label != labels.last {
Spacer()
}
}
}
}
.frame(maxHeight: .infinity)
.padding(8)
Rectangle()
.foregroundColor(.clear)
.background(LinearGradient(gradient: Gradient(colors: colors ?? []), startPoint: .top, endPoint: .bottom))
.padding(8)
.frame(width: 30)
}
.frame(width: CGFloat(width), height: CGFloat(height))
.background(.white.opacity(0.7))
.cornerRadius(5)
.shadow(color: Color.gray.opacity(0.7), radius: 8, x: 0, y: 0)
.padding()
.transition(.move(edge: isShowingLegend ? .leading : .trailing))
}
}
}
struct GradientLegendView_Previews: PreviewProvider {
static var previews: some View {
GradientLegendView(
isShowingLegend: .constant(true),
labels: SampleData.createHeatmapLegendLabelArray(),
colors: SampleData.createHeatmapLegendColorArray(),
width: 120,
height: 200
)
}
}
struct Sample {
static func createHeatmapLegendLabelArray() -> [String] {
return ["Great", "Major", "Strong", "Moderate", "Small"]
}
func createHeatmapLegendColorArray() -> [Color] {
return [.red, .purple, .orange, .green]
}
}
And i use it here and run the animation using withAnimation { }
@State private var isShowingLegend = true
var body: some View {
Text("Hey")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.edgesIgnoringSafeArea(.all)
.task {
setupMenuItems()
}
.overlay(
HStack {
GradientLegendView(
isShowingLegend: $isShowingLegend,
labels: SampleData.createHeatmapLegendLabelArray(),
colors: SampleData.createHeatmapLegendColorArray(),
width: 120,
height: 200)
Spacer()
},
alignment: .bottom
)
}
Now, say i also have a button instead of Text("hey") where the action code is
withAnimation(isShowingLegend ? .easeIn(duration: 0.5) : .easeOut(duration: 0.5)) {
isShowingLegend.toggle()
}
Is it possible that this withAnimatoin be placed inslide GradientLegendView and will execute if the isShowingLegend value is change?