Open zgy0x01 opened 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.
it's a little bit track , and may have other bug.
not work!this can only keep root view not change ,but other view in foreach still redraw every time.
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) } }
just list every view out,and set the opt decide on current depth
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.
how can i keep scrollview at the old posiiton after pop?