matteopuc / swiftui-navigation-stack

An alternative SwiftUI NavigationView implementing classic stack-based navigation giving also some more control on animations and programmatic navigation.
MIT License
930 stars 87 forks source link

after pop,the previous scrollview auto scroll to top? #81

Open zgy0x01 opened 2 years ago

zgy0x01 commented 2 years ago

how can i keep scrollview at the old posiiton after pop?

zgy0x01 commented 2 years ago

well,i find a solution which mat be a little ugly but work :)

we can change how navigationview show .if the view is not current view ,we set its opacity to 0,in this case ,the view is still there, when it come to top,swiftui wont redraw it .

        Group {
          rootView
              .transition(navigationType == .push ? transitions.push : transitions.pop)
              .environmentObject(navigationStack)
              .opacity(showRoot ? 1.0 : 0.0)
              .allowsHitTesting(showRoot ? true : false)
            ForEach(navigationStack.viewStack.views){item in
              if(item.id == navigationStack.currentView!.id)
              {
                item.wrappedElement.transition(navigationType == .push ? transitions.push : transitions.pop)
                  .environmentObject(navigationStack)
              }
              else
              {
                item.wrappedElement.opacity(0).allowsHitTesting(false)
              }
            }
        }

to do this ,you need to remove 'private' before may properties. like viewstack,views.

zgy0x01 commented 2 years ago

it's a little bit track , and may have other bug.

zgy0x01 commented 2 years ago

not work!this can only keep root view not change ,but other view in foreach still redraw every time.

zgy0x01 commented 1 year ago

well , i found another ugly solution.in this way,you should mannully set the stack depth.

{ rootView .transition(navigationType == .push ? transitions.push : transitions.pop) .environmentObject(navigationStack) .opacity(showRoot ? 1.0 : 0.0) .allowsHitTesting(showRoot ? true : false) if(navigationStack.viewStack.views.count >= 1) { navigationStack.viewStack.views[0] .wrappedElement .transition(navigationType == .push ? transitions.push : transitions.pop) .environmentObject(navigationStack) .opacity(navigationStack.viewStack.views.count==1 ? 1.0 : 0.0) .allowsHitTesting(navigationStack.viewStack.views.count==1 ? true : false) } if(navigationStack.viewStack.views.count >= 2) { navigationStack.viewStack.views[1] .wrappedElement .transition(navigationType == .push ? transitions.push : transitions.pop) .environmentObject(navigationStack) .opacity(navigationStack.viewStack.views.count==2 ? 1.0 : 0.0) .allowsHitTesting(navigationStack.viewStack.views.count==2 ? true : false) } if(navigationStack.viewStack.views.count >= 3) { navigationStack.viewStack.views[2] .wrappedElement .transition(navigationType == .push ? transitions.push : transitions.pop) .environmentObject(navigationStack) .opacity(navigationStack.viewStack.views.count==3 ? 1.0 : 0.0) .allowsHitTesting(navigationStack.viewStack.views.count==3 ? true : false) } if(navigationStack.viewStack.views.count >= 4) { navigationStack.viewStack.views[3] .wrappedElement .transition(navigationType == .push ? transitions.push : transitions.pop) .environmentObject(navigationStack) .opacity(navigationStack.viewStack.views.count==4 ? 1.0 : 0.0) .allowsHitTesting(navigationStack.viewStack.views.count==4 ? true : false) } }

zgy0x01 commented 1 year ago

just list every view out,and set the opt decide on current depth

sethpoly commented 1 year ago

It looks like the references to the views are released whenever we push another view on top in this library. This is opposite to what native SwiftUI and UIKit do. Views should usually remain in memory until removed from the stack. Use a similar library like https://github.com/AlexRoar/PathPresenter which follows the usual standards.