xref: /expo/ios/Client/Menu/EXDevMenuWindow.m (revision fe1ef024)
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.hidden = YES;
25  }
26  return self;
27}
28
29- (void)makeKeyAndVisible
30{
31  [super makeKeyAndVisible];
32
33  // `makeKeyAndVisible` apparently doesn't call `hidden` setter so make sure the root view is attached.
34  [self attachRootViewController];
35}
36
37- (void)setHidden:(BOOL)hidden
38{
39  [super setHidden:hidden];
40
41  // Reset `rootViewController` so it gets appearing/disappearing events that we depend on.
42  if (hidden) {
43    [self detachRootViewController];
44  } else {
45    [self attachRootViewController];
46  }
47}
48
49#pragma mark - internal
50
51- (void)attachRootViewController
52{
53  if (!_viewController) {
54    _viewController = [EXDevMenuViewController new];
55  }
56  self.rootViewController = _viewController;
57}
58
59- (void)detachRootViewController
60{
61  self.rootViewController = nil;
62}
63
64@end
65