i want to toggle the height of a view when I press a button. I tried several things:
- Button with transition (but I think this solution isn't good)
- A Slider which one changes the height (like I want it, but I want to toggle between two values)
Here my current Swift File:
import SwiftUI
struct TextView2: View {
@State private var ChangeFrame2 = false
@State private var height: Double = 200
var body: some View {
if ChangeFrame2 {
Text("Hello, world!")
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 400)
.font(.largeTitle)
.foregroundColor(.white)
.background(Color.red)
.transition(.move(edge: .top))
} else {
Text("Hello, world!")
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: height)
.font(.largeTitle)
.foregroundColor(.white)
.background(Color.green)
.transition(.move(edge: .top))
}
Button("Press to show details") {
withAnimation(.easeInOut(duration: 1.00)) {
ChangeFrame2.toggle()
}
}
Slider(value: $height, in: 10...500)
Text("\(height, specifier: "%.0f") Height")
}
}
I also tried the following:
.background(ChangeFrame2 ? (maxHeight: 400) : (maxHeight: 600))
but it doesn't work. Thank you :)
CodePudding user response:
You can just have one Text
view, using the ternary operator to decide the height and background color.
The problem is that when you use if
, the two views now have different identities which breaks animations. You also have an unwanted move transition.
Code:
struct TextView: View {
@State private var changeFrame = false
@State private var height: Double = 200
var body: some View {
VStack {
Text("Hello, world!")
.frame(height: changeFrame ? 400 : height)
.frame(maxWidth: .infinity)
.font(.largeTitle)
.foregroundColor(.white)
.background(changeFrame ? Color.red : Color.green)
Button("Press to show details") {
withAnimation(.easeInOut(duration: 1)) {
changeFrame.toggle()
}
}
Slider(value: $height, in: 10...500)
Text("\(height, specifier: "%.0f") Height")
}
}
}
Result: