From dfc4695b3e69bbd963eb9b037bd38683c4043f83 Mon Sep 17 00:00:00 2001 From: Westin Newell Date: Tue, 7 Dec 2021 16:59:26 -0800 Subject: [PATCH 1/3] Fix bugs related to view controller containment --- .../Container/ContainerViewController.swift | 29 ++++++++++++++++ .../DescribedViewController.swift | 33 ++++++++++++++----- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/WorkflowUI/Sources/Container/ContainerViewController.swift b/WorkflowUI/Sources/Container/ContainerViewController.swift index ca543e3fa..0ffb6094a 100644 --- a/WorkflowUI/Sources/Container/ContainerViewController.swift +++ b/WorkflowUI/Sources/Container/ContainerViewController.swift @@ -78,6 +78,8 @@ addChild(rootViewController) view.addSubview(rootViewController.view) rootViewController.didMove(toParent: self) + + updatePreferredContentSizeIfNeeded() } override public func viewDidLayoutSubviews() { @@ -104,6 +106,33 @@ override public var supportedInterfaceOrientations: UIInterfaceOrientationMask { return rootViewController.supportedInterfaceOrientations } + + override public var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { + return rootViewController.preferredStatusBarUpdateAnimation + } + + @available(iOS 14.0, *) + override public var childViewControllerForPointerLock: UIViewController? { + return rootViewController + } + + override public func preferredContentSizeDidChange( + forChildContentContainer container: UIContentContainer + ) { + super.preferredContentSizeDidChange(forChildContentContainer: container) + + guard container === rootViewController else { return } + + updatePreferredContentSizeIfNeeded() + } + + private func updatePreferredContentSizeIfNeeded() { + let newPreferredContentSize = rootViewController.preferredContentSize + + guard newPreferredContentSize != preferredContentSize else { return } + + preferredContentSize = newPreferredContentSize + } } /// Wrapper around an AnyWorkflow that allows us to have a concrete diff --git a/WorkflowUI/Sources/ViewControllerDescription/DescribedViewController.swift b/WorkflowUI/Sources/ViewControllerDescription/DescribedViewController.swift index 7045944fe..071035772 100644 --- a/WorkflowUI/Sources/ViewControllerDescription/DescribedViewController.swift +++ b/WorkflowUI/Sources/ViewControllerDescription/DescribedViewController.swift @@ -50,7 +50,7 @@ view.addSubview(currentViewController.view) currentViewController.view.frame = view.bounds currentViewController.didMove(toParent: self) - preferredContentSize = currentViewController.preferredContentSize + updatePreferredContentSizeIfNeeded() } } } @@ -65,7 +65,8 @@ addChild(currentViewController) view.addSubview(currentViewController.view) currentViewController.didMove(toParent: self) - preferredContentSize = currentViewController.preferredContentSize + + updatePreferredContentSizeIfNeeded() } override public func viewDidLayoutSubviews() { @@ -93,15 +94,31 @@ return currentViewController.supportedInterfaceOrientations } - override public func preferredContentSizeDidChange(forChildContentContainer container: UIContentContainer) { + override public var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { + return currentViewController.preferredStatusBarUpdateAnimation + } + + @available(iOS 14.0, *) + override public var childViewControllerForPointerLock: UIViewController? { + return currentViewController + } + + override public func preferredContentSizeDidChange( + forChildContentContainer container: UIContentContainer + ) { super.preferredContentSizeDidChange(forChildContentContainer: container) - guard - (container as? UIViewController) == currentViewController, - container.preferredContentSize != preferredContentSize - else { return } + guard container === currentViewController else { return } + + updatePreferredContentSizeIfNeeded() + } + + private func updatePreferredContentSizeIfNeeded() { + let newPreferredContentSize = currentViewController.preferredContentSize + + guard newPreferredContentSize != preferredContentSize else { return } - preferredContentSize = container.preferredContentSize + preferredContentSize = newPreferredContentSize } } From 298a7a774402ce7d2091733346628eb180d522d5 Mon Sep 17 00:00:00 2001 From: Westin Newell Date: Thu, 9 Dec 2021 13:17:42 -0800 Subject: [PATCH 2/3] Add child workflows init container initializers --- WorkflowUI/Sources/Container/ContainerViewController.swift | 5 +++-- .../ViewControllerDescription/DescribedViewController.swift | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/WorkflowUI/Sources/Container/ContainerViewController.swift b/WorkflowUI/Sources/Container/ContainerViewController.swift index 0ffb6094a..13efcf3c0 100644 --- a/WorkflowUI/Sources/Container/ContainerViewController.swift +++ b/WorkflowUI/Sources/Container/ContainerViewController.swift @@ -47,6 +47,9 @@ super.init(nibName: nil, bundle: nil) + addChild(rootViewController) + rootViewController.didMove(toParent: self) + workflowHost .rendering .signal @@ -75,9 +78,7 @@ view.backgroundColor = .white - addChild(rootViewController) view.addSubview(rootViewController.view) - rootViewController.didMove(toParent: self) updatePreferredContentSizeIfNeeded() } diff --git a/WorkflowUI/Sources/ViewControllerDescription/DescribedViewController.swift b/WorkflowUI/Sources/ViewControllerDescription/DescribedViewController.swift index 071035772..3e6c6c000 100644 --- a/WorkflowUI/Sources/ViewControllerDescription/DescribedViewController.swift +++ b/WorkflowUI/Sources/ViewControllerDescription/DescribedViewController.swift @@ -24,6 +24,9 @@ public init(description: ViewControllerDescription) { self.currentViewController = description.buildViewController() super.init(nibName: nil, bundle: nil) + + addChild(currentViewController) + currentViewController.didMove(toParent: self) } public convenience init(screen: S, environment: ViewEnvironment) { @@ -62,9 +65,7 @@ override public func viewDidLoad() { super.viewDidLoad() - addChild(currentViewController) view.addSubview(currentViewController.view) - currentViewController.didMove(toParent: self) updatePreferredContentSizeIfNeeded() } From 6aca0a62fb55757fb8fad59c2726673a1beb57a0 Mon Sep 17 00:00:00 2001 From: Westin Newell Date: Fri, 10 Dec 2021 12:55:45 -0800 Subject: [PATCH 3/3] Fix failing test --- WorkflowUI/Tests/DescribedViewControllerTests.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WorkflowUI/Tests/DescribedViewControllerTests.swift b/WorkflowUI/Tests/DescribedViewControllerTests.swift index 79c5d1335..00052a938 100644 --- a/WorkflowUI/Tests/DescribedViewControllerTests.swift +++ b/WorkflowUI/Tests/DescribedViewControllerTests.swift @@ -43,7 +43,7 @@ XCTAssertEqual(currentViewController.count, 0) XCTAssertFalse(describedViewController.isViewLoaded) XCTAssertFalse(currentViewController.isViewLoaded) - XCTAssertNil(currentViewController.parent) + XCTAssertEqual(currentViewController.parent, describedViewController) } func test_viewDidLoad() { @@ -75,7 +75,7 @@ XCTAssertEqual((describedViewController.currentViewController as? CounterViewController)?.count, 1) XCTAssertFalse(describedViewController.isViewLoaded) XCTAssertFalse(describedViewController.currentViewController.isViewLoaded) - XCTAssertNil(describedViewController.currentViewController.parent) + XCTAssertEqual(describedViewController.currentViewController.parent, describedViewController) } func test_update_toCompatibleDescription_afterViewLoads() {