Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#import <React/RCTLocalizedString.h>
#import <React/RCTLog.h>
#import <React/RCTRadialGradient.h>
#import <React/UIView+React.h>
#import <react/featureflags/ReactNativeFeatureFlags.h>
#import <react/renderer/components/view/ViewComponentDescriptor.h>
#import <react/renderer/components/view/ViewEventEmitter.h>
Expand Down Expand Up @@ -726,6 +727,23 @@ - (void)prepareForRecycle
_layoutMetrics = {};
}

- (void)updateSwiftUIWrapperAttachment
{
if (_swiftUIWrapper == nullptr) {
return;
}

if (self.window == nil) {
[_swiftUIWrapper detachFromParentViewController];
return;
}

UIViewController *parentViewController = self.reactViewController;
if (parentViewController != nil) {
[_swiftUIWrapper attachToParentViewController:parentViewController inContainerView:self];
}
}

- (void)setPropKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN:(NSSet<NSString *> *_Nullable)props
{
_propKeysManagedByAnimated_DO_NOT_USE_THIS_IS_BROKEN = props;
Expand Down Expand Up @@ -927,7 +945,7 @@ - (UIView *)effectiveContentView
self.layer.mask = nil;
[_swiftUIWrapper updateContentView:swiftUIContentView];
[_swiftUIWrapper updateLayoutWithBounds:self.bounds];
[self addSubview:_swiftUIWrapper.hostingView];
[self updateSwiftUIWrapperAttachment];

[self transferVisualPropertiesFromView:self toView:swiftUIContentView];
}
Expand All @@ -944,7 +962,7 @@ - (UIView *)effectiveContentView

[self transferVisualPropertiesFromView:swiftUIContentView toView:self];

[_swiftUIWrapper.hostingView removeFromSuperview];
[_swiftUIWrapper detachFromParentViewController];
_swiftUIWrapper = nil;
}
}
Expand Down Expand Up @@ -1401,6 +1419,12 @@ - (void)didMoveToSuperview
}
}

- (void)didMoveToWindow
{
[super didMoveToWindow];
[self updateSwiftUIWrapperAttachment];
}

- (void)updateAccessibilityElements
{
if ([_accessibilityOrderNativeIDs count] == 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,33 @@ import UIKit
return hostingController?.view
}

@objc public func attach(to parentViewController: UIViewController, in containerView: UIView) {
guard let hostingController else {
return
}

if hostingController.parent === parentViewController && hostingController.view.superview === containerView {
return
}

detachFromParentViewController()
parentViewController.addChild(hostingController)
containerView.addSubview(hostingController.view)
hostingController.didMove(toParent: parentViewController)
}

@objc public func detachFromParentViewController() {
guard let hostingController else {
return
}

if hostingController.parent != nil {
hostingController.willMove(toParent: nil)
}
hostingController.view.removeFromSuperview()
hostingController.removeFromParent()
}

@objc public func contentView() -> UIView? {
return containerViewModel.contentView
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ NS_ASSUME_NONNULL_BEGIN
- (void)updateHueRotate:(NSNumber *)degrees;
- (void)updateContentView:(UIView *)view;
- (UIView *_Nullable)hostingView;
- (void)attachToParentViewController:(UIViewController *)parentViewController inContainerView:(UIView *)containerView;
- (void)detachFromParentViewController;
- (void)resetStyles;
- (void)updateLayoutWithBounds:(CGRect)bounds;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ - (UIView *_Nullable)hostingView
return [self.swiftContainerView hostingView];
}

- (void)attachToParentViewController:(UIViewController *)parentViewController inContainerView:(UIView *)containerView
{
[self.swiftContainerView attachTo:parentViewController in:containerView];
}

- (void)detachFromParentViewController
{
[self.swiftContainerView detachFromParentViewController];
}

- (void)resetStyles
{
[self.swiftContainerView resetStyles];
Expand Down