diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift index 8fbcc27b9..b1f571210 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingView.swift @@ -167,12 +167,14 @@ open class _UIHostingView: UIView, XcodeViewDebugDataProvider where Con } // TODO super.init(frame: .zero) - - initializeViewGraph() + // TODO + let base = base + if let host = base.host { + host.initializeViewGraph() + base.setupNotifications() + } // RepresentableContextValues.current = - renderer.host = self - // TODO HostingViewRegistry.shared.add(self) Update.end() @@ -465,7 +467,7 @@ extension _UIHostingView { } } -extension _UIHostingView: ViewGraphDelegate { +extension _UIHostingView: ViewRendererHost { package func `as`(_ type: T.Type) -> T? { guard let value = base.as(type) else { // TODO @@ -474,13 +476,6 @@ extension _UIHostingView: ViewGraphDelegate { return value } - package func requestUpdate(after: Double) { - // TODO - requestImmediateUpdate() - } -} - -extension _UIHostingView: ViewRendererHost { package var renderingPhase: ViewRenderingPhase { get { base.renderingPhase } set { base.renderingPhase = newValue } @@ -521,26 +516,20 @@ extension _UIHostingView: ViewRendererHost { viewGraph.setRootView(rootView) } - func requestImmediateUpdate() { - // FIXME - setNeedsLayout() - } - package func outputsDidChange(outputs: ViewGraph.Outputs) { - // TODO + _openSwiftUIUnimplementedWarning() } package func focusDidChange() { - // TODO - } - - package func rootTransform() -> ViewTransform { _openSwiftUIUnimplementedWarning() - return ViewTransform() + } + + package func requestUpdate(after delay: Double) { + base.requestUpdate(after: delay) } public func preferencesDidChange() { - // TODO + _openSwiftUIUnimplementedWarning() } } diff --git a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift index dd4e0faf0..aacc91cf6 100644 --- a/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift +++ b/Sources/OpenSwiftUI/Integration/Hosting/UIKit/View/UIHostingViewBase.swift @@ -265,7 +265,27 @@ package class UIHostingViewBase { } package func requestUpdate(after delay: Double) { - _openSwiftUIUnimplementedFailure() + Update.lock() + if delay != .zero || (viewGraph.mayDeferUpdate && displayLink?.willRender == true) { + let delay = Double(UIAnimationDragCoefficient()) * delay + if delay >= 0.25 { + startUpdateTimer(delay: delay) + } else { + startDisplayLink(delay: delay) + } + } else { + if Thread.isMainThread { + requestImmediateUpdate() + } else { + DispatchQueue.main.async { [weak self] in + guard let self else { + return + } + requestImmediateUpdate() + } + } + } + Update.unlock() } package func updateRemovedState(uiView: UIView?) { @@ -296,7 +316,12 @@ package class UIHostingViewBase { return } guard updatesAtFullFidelity else { - // TODO: + cancelAsyncRendering() + clearDisplayLink() + clearUpdateTimer() + if uiView.layer.needsLayout() { + requestImmediateUpdate() + } return } uiView.setNeedsLayout() @@ -469,6 +494,13 @@ package class UIHostingViewBase { updateRemovedState(uiView: nil) } } + updateSceneNotifications() + updateWindowNotifications() + requestUpdateForFidelity() + if window == nil { + isRotatingWindow = false + } + host.invalidateProperties(.environment) } // MARK: - Notification