xref: /expo/ios/Client/Menu/EXDevMenuWindow.m (revision b4759e5f)
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