11import SwiftUI
22import UIKit
3+ import ResultBuilderKit
34
45/// Actions that comes from ``FluidStackController``
56public enum FluidStackAction {
@@ -55,15 +56,8 @@ open class FluidStackController: UIViewController {
5556 stackingItems. map { $0. viewController }
5657 }
5758
58- private( set) var stackingItems : [ PresentedViewControllerWrapperView ] = [ ] {
59+ private( set) var stackingItems : [ StackingPlatterView ] = [ ] {
5960 didSet {
60- Log . debug (
61- . stack,
62- """
63- Updated Stacking: \( stackingItems. count)
64- \( stackingItems. map { " - \( $0. debugDescription) " } . joined ( separator: " \n " ) )
65- """
66- )
6761 // TODO: Update with animation
6862 UIViewPropertyAnimator ( duration: 0.4 , dampingRatio: 1 ) {
6963 self . setNeedsStatusBarAppearanceUpdate ( )
@@ -138,6 +132,19 @@ open class FluidStackController: UIViewController {
138132 }
139133
140134 // MARK: - Functions
135+
136+ public func stackingDescription( ) -> String {
137+
138+ let body = stackingItems. map { item in
139+ " - isLoaded: \( item. isLoaded) , \( item. viewController. debugDescription) "
140+ }
141+ . joined ( separator: " \n " )
142+
143+ return """
144+ Stacking: \( stackingItems. count) , \( self . debugDescription)
145+ \( body)
146+ """
147+ }
141148
142149 /**
143150 Make sure call super method when you create override.
@@ -210,14 +217,14 @@ open class FluidStackController: UIViewController {
210217 viewControllerToAdd. fluidStackContext = context
211218 }
212219
213- let wrapperView : PresentedViewControllerWrapperView
220+ let wrapperView : StackingPlatterView
214221
215- if let currentWrapperView = viewControllerToAdd. view. superview as? PresentedViewControllerWrapperView {
222+ if let currentWrapperView = viewControllerToAdd. view. superview as? StackingPlatterView {
216223 // reuse
217224 wrapperView = currentWrapperView
218225 } else {
219226 // create new one
220- let containerView = PresentedViewControllerWrapperView (
227+ let containerView = StackingPlatterView (
221228 viewController: viewControllerToAdd,
222229 frame: self . view. bounds
223230 )
@@ -251,7 +258,7 @@ open class FluidStackController: UIViewController {
251258 viewControllerToAdd. fluidStackActionHandler ? ( . didDisplay)
252259
253260 assert ( viewControllerToAdd. view. superview != nil )
254- assert ( viewControllerToAdd. view. superview is PresentedViewControllerWrapperView )
261+ assert ( viewControllerToAdd. view. superview is StackingPlatterView )
255262
256263 let newTransitionContext = AddingTransitionContext (
257264 contentView: wrapperView,
@@ -280,6 +287,8 @@ open class FluidStackController: UIViewController {
280287 }
281288
282289 context. transitionSucceeded ( )
290+
291+ Log . debug ( . stack, self . stackingDescription ( ) )
283292
284293 }
285294 )
@@ -399,7 +408,7 @@ open class FluidStackController: UIViewController {
399408 Make sure to complete the transition with the context.
400409 */
401410 private func _startRemoving(
402- _ viewToRemove: PresentedViewControllerWrapperView
411+ _ viewToRemove: StackingPlatterView
403412 ) -> RemovingTransitionContext {
404413
405414 // Ensure it's managed
@@ -411,7 +420,7 @@ open class FluidStackController: UIViewController {
411420 }
412421
413422 // finds a view controller that will be displayed next.
414- let backView : PresentedViewControllerWrapperView ? = {
423+ let backView : StackingPlatterView ? = {
415424 let target = index. advanced ( by: - 1 )
416425 if stackingItems. indices. contains ( target) {
417426 return stackingItems [ target]
@@ -448,6 +457,8 @@ open class FluidStackController: UIViewController {
448457
449458 context. transitionSucceeded ( )
450459
460+ Log . debug ( . stack, self . stackingDescription ( ) )
461+
451462 } ,
452463 onRequestedDisplayOnTop: { [ weak self] source in
453464
@@ -535,9 +546,6 @@ open class FluidStackController: UIViewController {
535546
536547 /**
537548 Removes all view controllers which are displaying
538-
539- - Parameters:
540- - leavesRoot: If true, the first view controller will still be alive.
541549 */
542550 public func removeAllViewController(
543551 transition: AnyBatchRemovingTransition ?
@@ -614,12 +622,13 @@ open class FluidStackController: UIViewController {
614622 itemToRemove. viewController. fluidStackContext = nil
615623
616624 self . stackingItems. removeAll { instance in
617- ( instance as PresentedViewControllerWrapperView ) == ( itemToRemove as PresentedViewControllerWrapperView )
625+ ( instance as StackingPlatterView ) == ( itemToRemove as StackingPlatterView )
618626 }
619627 }
620628
621629 context. transitionSucceeded ( )
622630
631+ Log . debug ( . stack, self . stackingDescription ( ) )
623632 }
624633 )
625634
@@ -654,7 +663,7 @@ open class FluidStackController: UIViewController {
654663
655664 private func addPortalView(
656665 for source: DisplaySource ,
657- on targetView: PresentedViewControllerWrapperView
666+ on targetView: StackingPlatterView
658667 ) -> DisplayingOnTopSubscription {
659668
660669 assert ( Thread . isMainThread)
@@ -689,11 +698,11 @@ open class FluidStackController: UIViewController {
689698 /**
690699 Offloads view controllers which do not need to display from their wrapper view.
691700 */
692- private func updateOffloadingItems( displayItem: PresentedViewControllerWrapperView ) {
701+ private func updateOffloadingItems( displayItem: StackingPlatterView ) {
693702
694703 let items = stackingItems
695704
696- var order : [ ( PresentedViewControllerWrapperView , Bool ) ] = [ ]
705+ var order : [ ( StackingPlatterView , Bool ) ] = [ ]
697706
698707 var offloads : Bool = false
699708 var isInBehindDisplayItem : Bool = false
@@ -725,9 +734,7 @@ open class FluidStackController: UIViewController {
725734 }
726735
727736 }
728-
729- Log . debug ( . stack, " Update offloading: \n \( order. map { " \( $0. 0 == displayItem ? " -> " : " " ) \( $0. 1 ? " off " : " on " ) \( $0. 0 . viewController. fluidStackContentConfiguration. contentType) " } . joined ( separator: " \n " ) ) " )
730-
737+
731738 for (item, offloads) in order {
732739 if offloads {
733740 item. offloadViewController ( )
@@ -738,7 +745,25 @@ open class FluidStackController: UIViewController {
738745
739746 }
740747
748+
749+ }
741750
751+ extension FluidStackController {
752+
753+ open override var debugDescription : String {
754+ let pointer = Unmanaged . passUnretained ( self ) . toOpaque ( )
755+
756+ let properties : [ ( String , String ) ] = buildArray {
757+
758+ ( " identifier " , identifier? . rawValue ?? " null " )
759+
760+ }
761+
762+ let body = properties. map { " \( $0. 0 ) = \( $0. 1 ) ; " } . joined ( separator: " " )
763+
764+ return " < \( String ( reflecting: type ( of: self ) ) ) : \( pointer. debugDescription) ; \( body) > "
765+ }
766+
742767}
743768
744769// MARK: - Nested types
@@ -793,7 +818,10 @@ extension FluidStackController {
793818
794819 }
795820
796- final class PresentedViewControllerWrapperView : UIView {
821+ /**
822+ A view that manages view controller in stack
823+ */
824+ final class StackingPlatterView : UIView {
797825
798826 private( set) var isLoaded : Bool = true
799827
@@ -807,8 +835,10 @@ extension FluidStackController {
807835 ) {
808836
809837 self . viewController = viewController
810-
838+
811839 super. init ( frame: frame)
840+
841+ accessibilityIdentifier = String ( reflecting: viewController)
812842
813843 backgroundColor = . clear
814844
0 commit comments