'SwiftUI reverse ScrollView from bottom to top
I want to make a ScrollView that will give me the possibility to scroll from bottom to top. Basically I have a gradient background (bottom - black, top - white). When I set the ScrollView I can scroll down from white to black. I want the app to start at the bottom of ScrollView, to give me the possibility to scroll upwards. (From Black to White)
Thank you!
Current code:
struct ContentView: View {
var body: some View {
ScrollView(.vertical/*, showsIndicators: false*/){
VStack(spacing: 0) {
ForEach ((0..<4).reversed(), id: \.self) {
Image("background\($0)").resizable()
.aspectRatio(contentMode: .fill)
.frame(width: UIScreen.main.bounds.width ,height:1000)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.red)
}
.edgesIgnoringSafeArea(.all)
}
}
Solution 1:[1]
I was able to achieve this with a StackView inside a UIScrollView. Put whatever you want in the stackview then in the ViewController.viewDidLoad do
//flip the scrollview
scrollview.transform = CGAffineTransform(rotationAngle: Double.pi)
//flip the stackview
stackview.transform = CGAffineTransform(rotationAngle: Double.pi)
Now the scrollview will scroll from the bottom up
Solution 2:[2]
I wanted the scrollview to appear bottom to top instead of top to bottom. This had my answer: https://www.thirdrocktechkno.com/blog/implementing-reversed-scrolling-behaviour-in-swiftui/
TLDR: .rotationEffect(Angle(degrees: 180)).scaleEffect(x: -1.0, y: 1.0, anchor: .center) on the scrollview AND on the items in the scrollview
My full code:
ScrollView(.vertical, showsIndicators: true, content: {
LazyVStack(alignment: .center, spacing: nil, pinnedViews: [], content: {
ForEach(1...5, id: \.self) { count in
ScrollView(.horizontal, showsIndicators: false, content: {
LazyHStack(alignment: .center, spacing: nil, pinnedViews: [], content: {
ForEach(1...10, id: \.self) { count in
Text("Placeholder \(count)").rotationEffect(Angle(degrees: 180)).scaleEffect(x: -1.0, y: 1.0, anchor: .center)
}
})
})
}
})
}).rotationEffect(Angle(degrees: 180)).scaleEffect(x: -1.0, y: 1.0, anchor: .center)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | JRog |
| Solution 2 | jonmecer |
