Skip to content

Commit ffe2e19

Browse files
committed
Merge pull request #51 from Raizlabs/develop
Release 0.3.0
2 parents 1b6f80e + 3a83eec commit ffe2e19

21 files changed

Lines changed: 221 additions & 391 deletions

Classes/RZDebugMenu.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
// Copyright (c) 2014 Raizlabs. All rights reserved.
77
//
88

9-
#import "RZDebugMenuClearViewController.h"
10-
119
/**
1210
* Observer notification name constant. Notification with this name sent on a change in the Debug Menu. The userInfo on the Notification sent contains the setting's key:value pair that was changed.
1311
*/
@@ -36,12 +34,25 @@ OBJC_EXTERN NSString* const kRZDebugMenuSettingChangedNotification;
3634
+ (instancetype)sharedDebugMenu;
3735

3836
/**
39-
* Configure automatic show / hide of the debug menu button with a 5-tap gesture on the selected window.
37+
* Configure presentation of the debug menu button with a 3-finger, 3-tap gesture on the specified view.
38+
*
39+
* @param view The view on which to set up the presentation gesture.
40+
*/
41+
- (void)registerDebugMenuPresentationGestureOnView:(UIView *)view;
4042

41-
* @param window The window to set up for automatic show / hide of the debug menu button.
43+
/**
44+
* Manually present the debug menu on the root view controller of the presentation's main window, or the deepest presented view controller if a presentation is already active.
4245
*/
43-
- (void)configureAutomaticShowHideOnWindow:(UIWindow *)window;
46+
- (void)presentDebugMenu;
4447

45-
@property (assign, nonatomic, readwrite) BOOL showDebugMenuButton;
48+
/**
49+
* Manually dismiss the debug menu, if it is currently presented.
50+
*/
51+
- (void)dismissDebugMenu;
52+
53+
/**
54+
* The top-level view controller for the debug menu to present (in case you want to present it manually yourself).
55+
*/
56+
@property (strong, nonatomic, readonly) UIViewController *debugMenuViewControllerToPresent;
4657

4758
@end

Classes/RZDebugMenu.m

Lines changed: 49 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88

99
#import "RZDebugMenu.h"
1010

11-
#import "RZDebugMenuWindow.h"
12-
1311
#import "RZDebugMenuSettings.h"
1412
#import "RZDebugMenuSettingsForm.h"
1513
#import "RZDebugMenuSettingsParser.h"
@@ -20,6 +18,7 @@
2018
#import "RZDebugMenuSettings_Private.h"
2119
#import "RZDebugMenuVersionItem.h"
2220
#import "RZDebugMenuGroupItem.h"
21+
#import "UIViewController+RZDebugMenuPresentationAdditions.h"
2322

2423
#import "RZDebugLogMenuDefines.h"
2524

@@ -29,12 +28,12 @@
2928

3029
NSString* const kRZDebugMenuSettingChangedNotification = @"RZDebugMenuSettingChanged";
3130

32-
static NSUInteger kRZNumberOfTapsToHide = 4;
31+
static NSUInteger kRZNumberOfTapsToShow = 3;
32+
static NSUInteger kRZNumberOfTouchesToShow = 2;
3333

34-
@interface RZDebugMenu () <RZDebugMenuClearViewControllerDelegate>
34+
@interface RZDebugMenu () <RZDebugMenuFormViewControllerDelegate>
3535

36-
@property (strong, nonatomic) RZDebugMenuWindow *topWindow;
37-
@property (strong, nonatomic) RZDebugMenuClearViewController *clearRootViewController;
36+
@property (strong, nonatomic, readwrite) UIViewController *debugMenuViewControllerToPresent;
3837

3938
@property (strong, nonatomic, readwrite) NSArray *settingsMenuItems;
4039

@@ -73,60 +72,30 @@ - (RZDebugMenu *)init_internal
7372
{
7473
self = [super init];
7574
if ( self ) {
76-
[[NSNotificationCenter defaultCenter] addObserver:self
77-
selector:@selector(applicationDidFinishLaunching:)
78-
name:UIApplicationDidFinishLaunchingNotification
79-
object:nil];
80-
81-
self.showDebugMenuButton = NO;
75+
[self configureDebugMenu];
8276
}
8377

8478
return self;
8579
}
8680

87-
# pragma mark - Configuration
88-
89-
- (void)configureTopWindowIfNeeded
90-
{
91-
if ( self.clearRootViewController == nil ) {
92-
self.clearRootViewController = [[RZDebugMenuClearViewController alloc] initWithDelegate:self];
93-
94-
UIScreen *mainScreen = [UIScreen mainScreen];
95-
self.topWindow = [[RZDebugMenuWindow alloc] initWithFrame:mainScreen.bounds];
96-
self.topWindow.windowLevel = UIWindowLevelStatusBar - 1.f;
97-
self.topWindow.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
98-
self.topWindow.rootViewController = self.clearRootViewController;
99-
self.topWindow.hidden = NO;
100-
}
101-
}
102-
103-
#pragma mark - UX
81+
#pragma mark - Configuration
10482

105-
- (void)displayDebugMenu
83+
- (void)configureDebugMenu
10684
{
10785
if ( self.settingsMenuItems.count > 0 ) {
10886
RZDebugMenuSettingsForm *settingsForm = [[RZDebugMenuSettingsForm alloc] initWithSettingsMenuItems:self.settingsMenuItems];
10987

110-
FXFormViewController *settingsMenuViewController = [[RZDebugMenuFormViewController alloc] init];
88+
RZDebugMenuFormViewController *settingsMenuViewController = [[RZDebugMenuFormViewController alloc] init];
89+
settingsMenuViewController.delegate = self;
90+
91+
settingsForm.delegate = settingsMenuViewController;
92+
11193
settingsMenuViewController.formController.form = settingsForm;
11294

11395
UINavigationController *modalNavigationController = [[UINavigationController alloc] initWithRootViewController:settingsMenuViewController];
114-
[self.clearRootViewController presentViewController:modalNavigationController animated:YES completion:nil];
115-
}
116-
}
117-
118-
#pragma mark - RZDebugMenuClearViewControllerDelegate
119-
120-
- (void)clearViewControllerDebugMenuButtonPressed:(RZDebugMenuClearViewController *)clearViewController
121-
{
122-
[self displayDebugMenu];
123-
}
124-
125-
#pragma mark - Notifications
12696

127-
- (void)applicationDidFinishLaunching:(NSNotification *)note
128-
{
129-
[self configureTopWindowIfNeeded];
97+
self.debugMenuViewControllerToPresent = modalNavigationController;
98+
}
13099
}
131100

132101
#pragma mark - Settings Menu
@@ -156,44 +125,58 @@ - (void)loadSettingsMenuFromPlistName:(NSString *)plistName
156125
}
157126

158127
self.settingsMenuItems = settingsMenuItems;
128+
129+
[self configureDebugMenu];
159130
}
160131

161-
# pragma mark - Show / Hide
132+
# pragma mark - Presentation
162133

163-
- (void)configureAutomaticShowHideOnWindow:(UIWindow *)window
134+
- (void)registerDebugMenuPresentationGestureOnView:(UIView *)view
164135
{
165-
NSAssert(window != nil, @"");
166-
167-
UIViewController *rootViewController = window.rootViewController;
168-
NSAssert(rootViewController != nil, @"");
169-
170-
UIView *view = rootViewController.view;
171136
NSAssert(view != nil, @"");
172137

173-
UITapGestureRecognizer *manyTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(manyTapGestureRecognizerFired:)];
174-
manyTapGestureRecognizer.numberOfTapsRequired = kRZNumberOfTapsToHide;
138+
UITapGestureRecognizer *manyTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(debugMenuActivationGestureRecognizerFired:)];
139+
manyTapGestureRecognizer.numberOfTapsRequired = kRZNumberOfTapsToShow;
140+
manyTapGestureRecognizer.numberOfTouchesRequired = kRZNumberOfTouchesToShow;
175141

176142
[view addGestureRecognizer:manyTapGestureRecognizer];
177143
}
178144

179-
- (void)manyTapGestureRecognizerFired:(id)sender
145+
- (void)presentDebugMenu
180146
{
181-
[self showHideDebugMenuButton];
147+
if ( self.debugMenuViewControllerToPresent.presentingViewController != nil ) {
148+
NSLog(@"Not presenting debug menu. It is already active.");
149+
return;
150+
}
151+
152+
if ( self.debugMenuViewControllerToPresent == nil ) {
153+
NSLog(@"No debug menu enabled. Not presenting.");
154+
return;
155+
}
156+
157+
UIViewController *viewControllerToPresentOn = [UIApplication sharedApplication].keyWindow.rootViewController;
158+
viewControllerToPresentOn = viewControllerToPresentOn.rzDebugMenu_deepestViewControllerForPresentation;
159+
160+
[viewControllerToPresentOn presentViewController:self.debugMenuViewControllerToPresent animated:YES completion:nil];
182161
}
183162

184-
- (void)showHideDebugMenuButton
163+
- (void)debugMenuActivationGestureRecognizerFired:(id)sender
185164
{
186-
self.clearRootViewController.showDebugMenuButton = (!self.clearRootViewController.showDebugMenuButton);
165+
[self presentDebugMenu];
187166
}
188167

189-
- (void)setShowDebugMenuButton:(BOOL)showDebugMenuButton
168+
- (void)dismissDebugMenu
190169
{
191-
if ( _showDebugMenuButton != showDebugMenuButton ) {
192-
_showDebugMenuButton = showDebugMenuButton;
193-
194-
[self configureTopWindowIfNeeded];
195-
self.clearRootViewController.showDebugMenuButton = showDebugMenuButton;
170+
if ( self.debugMenuViewControllerToPresent.presentingViewController ) {
171+
[self.debugMenuViewControllerToPresent dismissViewControllerAnimated:YES completion:nil];
196172
}
197173
}
198174

175+
# pragma mark - RZDebugMenuFormViewControllerDelegate
176+
177+
- (void)debugMenuFormViewControllerShouldDimiss:(RZDebugMenuFormViewController *)debugMenuFormViewController
178+
{
179+
[self dismissDebugMenu];
180+
}
181+
199182
@end

Classes/RZDebugMenuFormViewController.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@
88

99
#import <FXForms/FXForms.h>
1010

11-
@interface RZDebugMenuFormViewController : FXFormViewController
11+
#import "RZDebugMenuSettingsForm.h"
12+
13+
@class RZDebugMenuFormViewController;
14+
15+
@protocol RZDebugMenuFormViewControllerDelegate <NSObject>
16+
17+
- (void)debugMenuFormViewControllerShouldDimiss:(RZDebugMenuFormViewController *)debugMenuFormViewController;
18+
19+
@end
20+
21+
@interface RZDebugMenuFormViewController : FXFormViewController <RZDebugMenuSettingsFormDelegate>
22+
23+
@property (weak, nonatomic, readwrite) id <RZDebugMenuFormViewControllerDelegate> delegate;
1224

1325
@end

Classes/RZDebugMenuFormViewController.m

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#import "RZDebugMenuFormViewController.h"
1010

11+
#import "RZDebugMenuSettingsForm.h"
12+
1113
static NSString *const kRZNavigationBarTitle = @"Debug Menu";
1214

1315
static NSString *const kRZNavigationBarDoneButtonTitle = @"Done";
@@ -38,8 +40,19 @@ - (NSString *)title
3840

3941
- (void)doneButtonTapped:(id)sender
4042
{
41-
[[NSUserDefaults standardUserDefaults] synchronize];
42-
[self dismissViewControllerAnimated:YES completion:nil];
43+
[self.delegate debugMenuFormViewControllerShouldDimiss:self];
44+
}
45+
46+
# pragma mark - RZDebugMenuSettingsFormDelegate
47+
48+
- (UIViewController *)viewControllerForChildPaneItem:(RZDebugMenuLoadedChildPaneItem *)childPaneItem
49+
{
50+
NSAssert(childPaneItem != nil, @"");
51+
52+
RZDebugMenuFormViewController *formViewController = [[RZDebugMenuFormViewController alloc] initWithNibName:nil bundle:nil];
53+
formViewController.delegate = self.delegate;
54+
55+
return formViewController;
4356
}
4457

4558
@end

Classes/UI/RZDebugMenuSettingsForm.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,18 @@
88

99
#import <FXForms/FXForms.h>
1010

11+
@class RZDebugMenuLoadedChildPaneItem;
12+
13+
@protocol RZDebugMenuSettingsFormDelegate <NSObject>
14+
15+
- (UIViewController *)viewControllerForChildPaneItem:(RZDebugMenuLoadedChildPaneItem *)childPaneItem;
16+
17+
@end
18+
1119
@interface RZDebugMenuSettingsForm : NSObject <FXForm>
1220

1321
- (instancetype)initWithSettingsMenuItems:(NSArray *)settingsMenuItems NS_DESIGNATED_INITIALIZER;
1422

23+
@property (weak, nonatomic, readwrite) id <RZDebugMenuSettingsFormDelegate> delegate;
24+
1525
@end

Classes/UI/RZDebugMenuSettingsForm.m

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,19 @@ - (NSArray *)uncachedFields
151151
else if ( [item isKindOfClass:[RZDebugMenuLoadedChildPaneItem class]] ) {
152152
formFieldType = FXFormFieldTypeDefault;
153153

154-
NSArray *settingsMenuItems = ((RZDebugMenuLoadedChildPaneItem *)item).settingsMenuItems;
154+
RZDebugMenuLoadedChildPaneItem *childPaneItem = (RZDebugMenuLoadedChildPaneItem *)item;
155+
NSArray *settingsMenuItems = childPaneItem.settingsMenuItems;
155156
RZDebugMenuSettingsForm *childSettingsForm = [[RZDebugMenuSettingsForm alloc] initWithSettingsMenuItems:settingsMenuItems];
157+
childSettingsForm.delegate = self.delegate;
158+
156159
defaultValue = childSettingsForm;
157160

158161
mutableFieldDictionary[FXFormFieldClass] = [RZDebugMenuSettingsForm class];
159-
mutableFieldDictionary[FXFormFieldViewController] = [[RZDebugMenuFormViewController alloc] init];
162+
163+
UIViewController *formViewController = [self.delegate viewControllerForChildPaneItem:childPaneItem];
164+
NSAssert(formViewController != nil, @"");
165+
166+
mutableFieldDictionary[FXFormFieldViewController] = formViewController;
160167
}
161168
else if ( [item isKindOfClass:[RZDebugMenuTitleItem class]] ) {
162169
formFieldType = FXFormFieldTypeDefault;

Classes/UI/View Controllers/RZDebugMenuClearViewController.h

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)