1// Copyright 2015-present 650 Industries. All rights reserved. 2 3#import "EXDevMenuWindow.h" 4#import "EXDevMenuViewController.h" 5#import "EXDevMenuManager.h" 6 7@interface EXDevMenuWindow () 8 9@property (nonatomic, strong) EXDevMenuViewController *viewController; 10 11@end 12 13@implementation EXDevMenuWindow 14 15#pragma mark - UIWindow 16 17- (instancetype)init 18{ 19 if (self = [super init]) { 20 // Set it just above the LogBox so users can easily access it. 21 // https://github.com/facebook/react-native/blob/0.64-stable/React/CoreModules/RCTLogBoxView.mm#L38 22 self.windowLevel = UIWindowLevelStatusBar; 23 self.backgroundColor = [UIColor clearColor]; 24 self.bounds = [[UIScreen mainScreen] bounds]; 25 self.hidden = YES; 26 } 27 return self; 28} 29 30- (void)makeKeyAndVisible 31{ 32 [super makeKeyAndVisible]; 33 34 // `makeKeyAndVisible` apparently doesn't call `hidden` setter so make sure the root view is attached. 35 [self attachRootViewController]; 36} 37 38- (void)setHidden:(BOOL)hidden 39{ 40 [super setHidden:hidden]; 41 42 // Reset `rootViewController` so it gets appearing/disappearing events that we depend on. 43 if (hidden) { 44 [self detachRootViewController]; 45 } else { 46 [self attachRootViewController]; 47 } 48} 49 50#pragma mark - internal 51 52- (void)attachRootViewController 53{ 54 if (!_viewController) { 55 _viewController = [EXDevMenuViewController new]; 56 } 57 self.rootViewController = _viewController; 58} 59 60- (void)detachRootViewController 61{ 62 self.rootViewController = nil; 63} 64 65@end 66