diff --git a/WorkflowUI/Sources/Container/ContainerViewController.swift b/WorkflowUI/Sources/Container/ContainerViewController.swift index ca543e3fa..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,9 @@ view.backgroundColor = .white - addChild(rootViewController) view.addSubview(rootViewController.view) - rootViewController.didMove(toParent: self) + + updatePreferredContentSizeIfNeeded() } override public func viewDidLayoutSubviews() { @@ -104,6 +107,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..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) { @@ -50,7 +53,7 @@ view.addSubview(currentViewController.view) currentViewController.view.frame = view.bounds currentViewController.didMove(toParent: self) - preferredContentSize = currentViewController.preferredContentSize + updatePreferredContentSizeIfNeeded() } } } @@ -62,10 +65,9 @@ override public func viewDidLoad() { super.viewDidLoad() - addChild(currentViewController) view.addSubview(currentViewController.view) - currentViewController.didMove(toParent: self) - preferredContentSize = currentViewController.preferredContentSize + + updatePreferredContentSizeIfNeeded() } override public func viewDidLayoutSubviews() { @@ -93,15 +95,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 } } 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() {