Procházet zdrojové kódy

Add FLEXNavigationController

Provides a gesture which automatically hides or shows the toolbar on explorer screens as you scroll when you turn on `hidesBarsOnSwipe`.

UINavigationController provides this functionality by default, except that it also hides the navigation bar, and the toolbar is always shown if it has no items for some odd reason. This subclass overrides a private method (verified to exist since at least iOS 9, up to at least iOS 13) to change that.
Tanner Bennett před 6 roky
rodič
revize
2160fb3c46

+ 17 - 0
Classes/Core/Controllers/FLEXNavigationController.h

@@ -0,0 +1,17 @@
+//
+//  FLEXNavigationController.h
+//  FLEX
+//
+//  Created by Tanner on 1/30/20.
+//  Copyright © 2020 Flipboard. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FLEXNavigationController : UINavigationController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 46 - 0
Classes/Core/Controllers/FLEXNavigationController.m

@@ -0,0 +1,46 @@
+//
+//  FLEXNavigationController.m
+//  FLEX
+//
+//  Created by Tanner on 1/30/20.
+//  Copyright © 2020 Flipboard. All rights reserved.
+//
+
+#import "FLEXNavigationController.h"
+
+@interface UINavigationController (Private) <UIGestureRecognizerDelegate>
+- (void)_gestureRecognizedInteractiveHide:(UIGestureRecognizer *)sender;
+@end
+@interface UIPanGestureRecognizer (Private)
+- (void)_setDelegate:(id)delegate;
+@end
+
+@interface FLEXNavigationController ()
+@property (nonatomic, readonly) BOOL toolbarWasHidden;
+@property (nonatomic) BOOL waitingToAddTab;
+@end
+
+@implementation FLEXNavigationController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    self.waitingToAddTab = YES;
+}
+
+- (void)_gestureRecognizedInteractiveHide:(UIPanGestureRecognizer *)sender {
+    if (sender.state == UIGestureRecognizerStateRecognized) {
+        BOOL show = self.topViewController.toolbarItems.count;
+        CGFloat yTranslation = [sender translationInView:self.view].y;
+        CGFloat yVelocity = [sender velocityInView:self.view].y;
+        if (yVelocity > 2000) {
+            [self setToolbarHidden:YES animated:YES];
+        } else if (show && yTranslation > 20 && yVelocity > 250) {
+            [self setToolbarHidden:NO animated:YES];
+        } else if (yTranslation < -20) {
+            [self setToolbarHidden:YES animated:YES];
+        }
+    }
+}
+
+@end

+ 7 - 3
Classes/ExplorerInterface/FLEXExplorerViewController.m

@@ -10,6 +10,7 @@
 #import "FLEXExplorerToolbar.h"
 #import "FLEXExplorerToolbar.h"
 #import "FLEXToolbarItem.h"
 #import "FLEXToolbarItem.h"
 #import "FLEXUtility.h"
 #import "FLEXUtility.h"
+#import "FLEXNavigationController.h"
 #import "FLEXHierarchyViewController.h"
 #import "FLEXHierarchyViewController.h"
 #import "FLEXGlobalsTableViewController.h"
 #import "FLEXGlobalsTableViewController.h"
 #import "FLEXObjectExplorerViewController.h"
 #import "FLEXObjectExplorerViewController.h"
@@ -80,7 +81,7 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     return self;
     return self;
 }
 }
 
 
--(void)dealloc
+- (void)dealloc
 {
 {
     for (UIView *view in _observedViews) {
     for (UIView *view in _observedViews) {
         [self stopObservingView:view];
         [self stopObservingView:view];
@@ -193,6 +194,7 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     }];
     }];
 }
 }
 
 
+
 #pragma mark - Setter Overrides
 #pragma mark - Setter Overrides
 
 
 - (void)setSelectedView:(UIView *)selectedView
 - (void)setSelectedView:(UIView *)selectedView
@@ -495,7 +497,7 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
 {
 {
     if (tapGR.state == UIGestureRecognizerStateRecognized && self.selectedView) {
     if (tapGR.state == UIGestureRecognizerStateRecognized && self.selectedView) {
         UIViewController *topStackVC = [FLEXObjectExplorerFactory explorerViewControllerForObject:self.selectedView];
         UIViewController *topStackVC = [FLEXObjectExplorerFactory explorerViewControllerForObject:self.selectedView];
-        UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:topStackVC];
+        UINavigationController *navigationController = [[FLEXNavigationController alloc] initWithRootViewController:topStackVC];
         [self makeKeyAndPresentViewController:navigationController animated:YES completion:nil];
         [self makeKeyAndPresentViewController:navigationController animated:YES completion:nil];
     }
     }
 }
 }
@@ -740,6 +742,7 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     [self resignKeyAndDismissViewControllerAnimated:YES completion:nil];
     [self resignKeyAndDismissViewControllerAnimated:YES completion:nil];
 }
 }
 
 
+
 #pragma mark - Modal Presentation and Window Management
 #pragma mark - Modal Presentation and Window Management
 
 
 - (void)makeKeyAndPresentViewController:(UINavigationController *)toPresent animated:(BOOL)animated completion:(void (^)(void))completion
 - (void)makeKeyAndPresentViewController:(UINavigationController *)toPresent animated:(BOOL)animated completion:(void (^)(void))completion
@@ -819,6 +822,7 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     }
     }
 }
 }
 
 
+
 #pragma mark - Keyboard Shortcut Helpers
 #pragma mark - Keyboard Shortcut Helpers
 
 
 - (void)toggleSelectTool
 - (void)toggleSelectTool
@@ -868,7 +872,7 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
     [self toggleToolWithViewControllerProvider:^UINavigationController *{
     [self toggleToolWithViewControllerProvider:^UINavigationController *{
         FLEXGlobalsTableViewController *globalsViewController = [FLEXGlobalsTableViewController new];
         FLEXGlobalsTableViewController *globalsViewController = [FLEXGlobalsTableViewController new];
         [FLEXGlobalsTableViewController setApplicationWindow:[UIApplication.sharedApplication keyWindow]];
         [FLEXGlobalsTableViewController setApplicationWindow:[UIApplication.sharedApplication keyWindow]];
-        return [[UINavigationController alloc] initWithRootViewController:globalsViewController];
+        return [[FLEXNavigationController alloc] initWithRootViewController:globalsViewController];
     } completion:nil];
     } completion:nil];
 }
 }
 
 

+ 2 - 1
Classes/Manager/FLEXManager+Extensibility.m

@@ -8,6 +8,7 @@
 
 
 #import "FLEXManager+Extensibility.h"
 #import "FLEXManager+Extensibility.h"
 #import "FLEXManager+Private.h"
 #import "FLEXManager+Private.h"
+#import "FLEXNavigationController.h"
 #import "FLEXGlobalsEntry.h"
 #import "FLEXGlobalsEntry.h"
 #import "FLEXObjectExplorerFactory.h"
 #import "FLEXObjectExplorerFactory.h"
 #import "FLEXKeyboardShortcutManager.h"
 #import "FLEXKeyboardShortcutManager.h"
@@ -222,7 +223,7 @@
         [topViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
         [topViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
     } else {
     } else {
         id viewController = [class new];
         id viewController = [class new];
-        UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
+        UINavigationController *navigationController = [[FLEXNavigationController alloc] initWithRootViewController:viewController];
         [topViewController presentViewController:navigationController animated:YES completion:nil];
         [topViewController presentViewController:navigationController animated:YES completion:nil];
     }
     }
 }
 }

+ 1 - 0
Classes/Network/FLEXNetworkHistoryTableViewController.m

@@ -72,6 +72,7 @@
     FLEXNetworkSettingsTableViewController *settingsViewController = [FLEXNetworkSettingsTableViewController new];
     FLEXNetworkSettingsTableViewController *settingsViewController = [FLEXNetworkSettingsTableViewController new];
     settingsViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(settingsViewControllerDoneTapped:)];
     settingsViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(settingsViewControllerDoneTapped:)];
     settingsViewController.title = @"Network Debugging Settings";
     settingsViewController.title = @"Network Debugging Settings";
+    // This is not a FLEXNavigationController because it is not intended as a new tab
     UINavigationController *wrapperNavigationController = [[UINavigationController alloc] initWithRootViewController:settingsViewController];
     UINavigationController *wrapperNavigationController = [[UINavigationController alloc] initWithRootViewController:settingsViewController];
     [self presentViewController:wrapperNavigationController animated:YES completion:nil];
     [self presentViewController:wrapperNavigationController animated:YES completion:nil];
 }
 }

+ 1 - 1
Classes/ObjectExplorers/FLEXObjectExplorerViewController.m

@@ -233,7 +233,7 @@
 }
 }
 
 
 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)g1 shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)g2 {
 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)g1 shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)g2 {
-    return [g2 class] == [UIPanGestureRecognizer class];
+    return [g2 isKindOfClass:[UIPanGestureRecognizer class]];
 }
 }
 
 
 #pragma mark - Description
 #pragma mark - Description

+ 2 - 2
Classes/ViewHierarchy/FLEXHierarchyViewController.h

@@ -6,7 +6,7 @@
 //  Copyright © 2020 Flipboard. All rights reserved.
 //  Copyright © 2020 Flipboard. All rights reserved.
 //
 //
 
 
-#import <UIKit/UIKit.h>
+#import "FLEXNavigationController.h"
 
 
 @protocol FLEXHierarchyDelegate <NSObject>
 @protocol FLEXHierarchyDelegate <NSObject>
 - (void)viewHierarchyDidDismiss:(UIView *)selectedView;
 - (void)viewHierarchyDidDismiss:(UIView *)selectedView;
@@ -14,7 +14,7 @@
 
 
 /// A navigation controller which manages two child view controllers:
 /// A navigation controller which manages two child view controllers:
 /// a 3D Reveal-like hierarchy explorer, and a 2D tree-list hierarchy explorer.
 /// a 3D Reveal-like hierarchy explorer, and a 2D tree-list hierarchy explorer.
-@interface FLEXHierarchyViewController : UINavigationController
+@interface FLEXHierarchyViewController : FLEXNavigationController
 
 
 + (instancetype)delegate:(id<FLEXHierarchyDelegate>)delegate;
 + (instancetype)delegate:(id<FLEXHierarchyDelegate>)delegate;
 + (instancetype)delegate:(id<FLEXHierarchyDelegate>)delegate
 + (instancetype)delegate:(id<FLEXHierarchyDelegate>)delegate

+ 8 - 0
FLEX.xcodeproj/project.pbxproj

@@ -176,6 +176,8 @@
 		C3531B9E23E69BB200A184AD /* FLEXManager+Networking.m in Sources */ = {isa = PBXBuildFile; fileRef = C3531B9C23E69BB200A184AD /* FLEXManager+Networking.m */; };
 		C3531B9E23E69BB200A184AD /* FLEXManager+Networking.m in Sources */ = {isa = PBXBuildFile; fileRef = C3531B9C23E69BB200A184AD /* FLEXManager+Networking.m */; };
 		C3531BA123E796BD00A184AD /* FLEXManager+Extensibility.h in Headers */ = {isa = PBXBuildFile; fileRef = C3531B9F23E796BD00A184AD /* FLEXManager+Extensibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		C3531BA123E796BD00A184AD /* FLEXManager+Extensibility.h in Headers */ = {isa = PBXBuildFile; fileRef = C3531B9F23E796BD00A184AD /* FLEXManager+Extensibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		C3531BA223E796BD00A184AD /* FLEXManager+Extensibility.m in Sources */ = {isa = PBXBuildFile; fileRef = C3531BA023E796BD00A184AD /* FLEXManager+Extensibility.m */; };
 		C3531BA223E796BD00A184AD /* FLEXManager+Extensibility.m in Sources */ = {isa = PBXBuildFile; fileRef = C3531BA023E796BD00A184AD /* FLEXManager+Extensibility.m */; };
+		C3531BA523E88A2100A184AD /* FLEXNavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = C3531BA323E88A2100A184AD /* FLEXNavigationController.h */; };
+		C3531BA623E88A2100A184AD /* FLEXNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = C3531BA423E88A2100A184AD /* FLEXNavigationController.m */; };
 		C362AE8123C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.h in Headers */ = {isa = PBXBuildFile; fileRef = C362AE7F23C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.h */; };
 		C362AE8123C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.h in Headers */ = {isa = PBXBuildFile; fileRef = C362AE7F23C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.h */; };
 		C362AE8223C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.m in Sources */ = {isa = PBXBuildFile; fileRef = C362AE8023C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.m */; };
 		C362AE8223C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.m in Sources */ = {isa = PBXBuildFile; fileRef = C362AE8023C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.m */; };
 		C36B096523E0D4A1008F5D47 /* UIMenu+FLEX.h in Headers */ = {isa = PBXBuildFile; fileRef = C36B096323E0D4A1008F5D47 /* UIMenu+FLEX.h */; };
 		C36B096523E0D4A1008F5D47 /* UIMenu+FLEX.h in Headers */ = {isa = PBXBuildFile; fileRef = C36B096323E0D4A1008F5D47 /* UIMenu+FLEX.h */; };
@@ -497,6 +499,8 @@
 		C3531B9C23E69BB200A184AD /* FLEXManager+Networking.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "FLEXManager+Networking.m"; sourceTree = "<group>"; };
 		C3531B9C23E69BB200A184AD /* FLEXManager+Networking.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "FLEXManager+Networking.m"; sourceTree = "<group>"; };
 		C3531B9F23E796BD00A184AD /* FLEXManager+Extensibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FLEXManager+Extensibility.h"; sourceTree = "<group>"; };
 		C3531B9F23E796BD00A184AD /* FLEXManager+Extensibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FLEXManager+Extensibility.h"; sourceTree = "<group>"; };
 		C3531BA023E796BD00A184AD /* FLEXManager+Extensibility.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "FLEXManager+Extensibility.m"; sourceTree = "<group>"; };
 		C3531BA023E796BD00A184AD /* FLEXManager+Extensibility.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "FLEXManager+Extensibility.m"; sourceTree = "<group>"; };
+		C3531BA323E88A2100A184AD /* FLEXNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXNavigationController.h; sourceTree = "<group>"; };
+		C3531BA423E88A2100A184AD /* FLEXNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXNavigationController.m; sourceTree = "<group>"; };
 		C362AE7F23C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSMapTable+FLEX_Subscripting.h"; sourceTree = "<group>"; };
 		C362AE7F23C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSMapTable+FLEX_Subscripting.h"; sourceTree = "<group>"; };
 		C362AE8023C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSMapTable+FLEX_Subscripting.m"; sourceTree = "<group>"; };
 		C362AE8023C7E9D1005A86AE /* NSMapTable+FLEX_Subscripting.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSMapTable+FLEX_Subscripting.m"; sourceTree = "<group>"; };
 		C36B096323E0D4A1008F5D47 /* UIMenu+FLEX.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIMenu+FLEX.h"; sourceTree = "<group>"; };
 		C36B096323E0D4A1008F5D47 /* UIMenu+FLEX.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIMenu+FLEX.h"; sourceTree = "<group>"; };
@@ -1007,6 +1011,8 @@
 			children = (
 			children = (
 				C38DF0E822CFE4370077B4AD /* FLEXTableViewController.h */,
 				C38DF0E822CFE4370077B4AD /* FLEXTableViewController.h */,
 				C38DF0E922CFE4370077B4AD /* FLEXTableViewController.m */,
 				C38DF0E922CFE4370077B4AD /* FLEXTableViewController.m */,
+				C3531BA323E88A2100A184AD /* FLEXNavigationController.h */,
+				C3531BA423E88A2100A184AD /* FLEXNavigationController.m */,
 			);
 			);
 			path = Controllers;
 			path = Controllers;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1247,6 +1253,7 @@
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 				779B1EDA1C0C4D7C001F5E49 /* FLEXTableListViewController.h in Headers */,
 				779B1EDA1C0C4D7C001F5E49 /* FLEXTableListViewController.h in Headers */,
+				C3531BA523E88A2100A184AD /* FLEXNavigationController.h in Headers */,
 				3A4C94ED1B5B21410088C3F2 /* FLEXArgumentInputColorView.h in Headers */,
 				3A4C94ED1B5B21410088C3F2 /* FLEXArgumentInputColorView.h in Headers */,
 				C3A9424523C641C1006871A3 /* SceneKit+Snapshot.h in Headers */,
 				C3A9424523C641C1006871A3 /* SceneKit+Snapshot.h in Headers */,
 				3A4C94EB1B5B21410088C3F2 /* FLEXImagePreviewViewController.h in Headers */,
 				3A4C94EB1B5B21410088C3F2 /* FLEXImagePreviewViewController.h in Headers */,
@@ -1608,6 +1615,7 @@
 				C31D93E523E38CBE005517BF /* FLEXBlockShortcuts.m in Sources */,
 				C31D93E523E38CBE005517BF /* FLEXBlockShortcuts.m in Sources */,
 				C34D4EB523A2AF2A00C1F903 /* FLEXColorPreviewSection.m in Sources */,
 				C34D4EB523A2AF2A00C1F903 /* FLEXColorPreviewSection.m in Sources */,
 				C36B097123E1EDCD008F5D47 /* FLEXTableViewSection.m in Sources */,
 				C36B097123E1EDCD008F5D47 /* FLEXTableViewSection.m in Sources */,
+				C3531BA623E88A2100A184AD /* FLEXNavigationController.m in Sources */,
 				3A4C94EA1B5B21410088C3F2 /* FLEXHierarchyTableViewController.m in Sources */,
 				3A4C94EA1B5B21410088C3F2 /* FLEXHierarchyTableViewController.m in Sources */,
 				3A4C95331B5B21410088C3F2 /* FLEXSystemLogTableViewCell.m in Sources */,
 				3A4C95331B5B21410088C3F2 /* FLEXSystemLogTableViewCell.m in Sources */,
 				C3A9423523C3F98E006871A3 /* FHSViewController.m in Sources */,
 				C3A9423523C3F98E006871A3 /* FHSViewController.m in Sources */,