-
-
Save mecid/e0d4d6652ccc8b5737449a01ee8cbc6f to your computer and use it in GitHub Desktop.
| // | |
| // PagerView.swift | |
| // | |
| // Created by Majid Jabrayilov on 12/5/19. | |
| // Copyright © 2019 Majid Jabrayilov. All rights reserved. | |
| // | |
| import SwiftUI | |
| struct PagerView<Content: View>: View { | |
| let pageCount: Int | |
| @Binding var currentIndex: Int | |
| let content: Content | |
| @GestureState private var translation: CGFloat = 0 | |
| init(pageCount: Int, currentIndex: Binding<Int>, @ViewBuilder content: () -> Content) { | |
| self.pageCount = pageCount | |
| self._currentIndex = currentIndex | |
| self.content = content() | |
| } | |
| var body: some View { | |
| GeometryReader { geometry in | |
| HStack(spacing: 0) { | |
| self.content.frame(width: geometry.size.width) | |
| } | |
| .frame(width: geometry.size.width, alignment: .leading) | |
| .offset(x: -CGFloat(self.currentIndex) * geometry.size.width) | |
| .offset(x: self.translation) | |
| .animation(.interactiveSpring()) | |
| .gesture( | |
| DragGesture().updating(self.$translation) { value, state, _ in | |
| state = value.translation.width | |
| }.onEnded { value in | |
| let offset = value.translation.width / geometry.size.width | |
| let newIndex = (CGFloat(self.currentIndex) - offset).rounded() | |
| self.currentIndex = min(max(Int(newIndex), 0), self.pageCount - 1) | |
| } | |
| ) | |
| } | |
| } | |
| } |
Is there any way to load the views lazily?
@samilao101 did you try to use LazyHStack instead of HStack?
@mecid I did, but the issue is that in order for a lazyhstack to become lazy it needs to be imbedded in a scrollview, and if you do that, you essentially lose the pagination feature.
@samilao101 oh, you're right. Maybe TabView with Page style will work for you better?
So isn't the lazy this approach....Load all contents and onAppear
@pjcau sorry I am not sure I understand what you mean
@pjcau sorry I am not sure I understand what you mean
IN this way, if you want load a array of DetalView for example, so load in one step all init and onAppear(). So it's not good. But fix it with TabView with Page style.
@pjcau did you manage to integrate ScrollView in order to achieve lazy loading?
This will more smoothly