1// Copyright 2015-present 650 Industries. All rights reserved. 2 3#import "EXEnvironment.h" 4#import "EXKernel.h" 5#import "EXViewController.h" 6#import "ExpoKit.h" 7#import "EXUtil.h" 8 9@interface EXViewController () 10 11@end 12 13@implementation EXViewController 14 15- (void)viewDidLoad 16{ 17 [super viewDidLoad]; 18 self.view.backgroundColor = [UIColor whiteColor]; 19 [self createRootAppAndMakeVisible]; 20} 21 22- (void)viewWillLayoutSubviews 23{ 24 [super viewWillLayoutSubviews]; 25 if (_contentViewController) { 26 _contentViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 27 } 28} 29 30- (UIRectEdge)edgesForExtendedLayout 31{ 32 return UIRectEdgeNone; 33} 34 35- (BOOL)extendedLayoutIncludesOpaqueBars 36{ 37 return YES; 38} 39 40- (void)createRootAppAndMakeVisible 41{ 42 NSURL *standaloneAppUrl = [NSURL URLWithString:[EXEnvironment sharedEnvironment].standaloneManifestUrl]; 43 NSDictionary *initialProps = [[EXKernel sharedInstance] initialAppPropsFromLaunchOptions:[ExpoKit sharedInstance].launchOptions]; 44 EXKernelAppRecord *appRecord = [[EXKernel sharedInstance] createNewAppWithUrl:standaloneAppUrl 45 initialProps:initialProps]; 46 47 UIViewController *viewControllerToShow = (UIViewController *)appRecord.viewController; 48 49 [viewControllerToShow willMoveToParentViewController:self]; 50 [self.view addSubview:viewControllerToShow.view]; 51 [viewControllerToShow didMoveToParentViewController:self]; 52 53 _contentViewController = viewControllerToShow; 54 [self.view setNeedsLayout]; 55 if (_delegate) { 56 [_delegate viewController:self didNavigateAppToVisible:appRecord]; 57 } 58} 59 60- (BOOL)shouldAutorotate 61{ 62 return YES; 63} 64 65- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^_Nullable)(void))completion 66{ 67 // @tsapeta: some RN's modules try to present modal view controllers on EXRootViewController 68 // but for the correct behavior they should be presented on the innermost controller in EXAppViewController hierarchy, 69 // so we just pass this call to the current controller. 70 if ([viewControllerToPresent isKindOfClass:[UIAlertController class]] 71 || [viewControllerToPresent isKindOfClass:[UIDocumentMenuViewController class]] 72// || [viewControllerToPresent isKindOfClass:[UIImagePickerController class]] // ImagePicker invoked from WebView with this specific logic makes AppController holding WebView to be dismissed 73 || [viewControllerToPresent isKindOfClass:[UIActivityViewController class]] 74 ) { 75 [[[ExpoKit sharedInstance] currentViewController] presentViewController:viewControllerToPresent animated:flag completion:completion]; 76 } else { 77 [super presentViewController:viewControllerToPresent animated:flag completion:completion]; 78 } 79} 80 81@end 82