Browse Source

Add custom bar button item class (#1641)

This allows for custom React Native views to be rendered as a bar button item in the navigation bar.
Eli Perkins 7 years ago
parent
commit
80ae102456

+ 12
- 0
ios/RCCCustomBarButtonItem.h View File

1
+#import <UIKit/UIKit.h>
2
+
3
+@class RCTRootView;
4
+@class RCTBridge;
5
+
6
+@interface RCCCustomBarButtonItem : UIBarButtonItem
7
+
8
+@property (nonnull, nonatomic, strong, readonly) RCTRootView *reactView;
9
+
10
+- (__nonnull instancetype)initWithComponentName:(NSString *__nonnull)component passProps:(NSDictionary *__nullable)passProps bridge:(RCTBridge *__nonnull)bridge;
11
+
12
+@end

+ 30
- 0
ios/RCCCustomBarButtonItem.m View File

1
+#import <React/RCTRootView.h>
2
+#import <React/RCTRootViewDelegate.h>
3
+#import "RCCCustomBarButtonItem.h"
4
+
5
+@interface RCCCustomBarButtonItem () <RCTRootViewDelegate>
6
+
7
+@property (nonnull, nonatomic, strong, readwrite) RCTRootView *reactView;
8
+
9
+@end
10
+
11
+@implementation RCCCustomBarButtonItem
12
+
13
+- (instancetype)initWithComponentName:(NSString *__nonnull)component passProps:(NSDictionary *)passProps bridge:(RCTBridge *__nonnull)bridge {
14
+    RCTRootView *reactView = [[RCTRootView alloc] initWithBridge:bridge moduleName:component initialProperties:passProps];
15
+    self = [super initWithCustomView:reactView];
16
+    if (self) {
17
+        reactView.sizeFlexibility = RCTRootViewSizeFlexibilityWidthAndHeight;
18
+        reactView.delegate = self;
19
+        reactView.backgroundColor = [UIColor clearColor];
20
+    }
21
+    return self;
22
+}
23
+
24
+- (void)rootViewDidChangeIntrinsicSize:(RCTRootView *)rootView {
25
+    CGSize size = rootView.intrinsicSize;
26
+    rootView.frame = CGRectMake(0, 0, size.width, size.height);
27
+    self.width = size.width;
28
+}
29
+
30
+@end

+ 8
- 1
ios/RCCNavigationController.m View File

3
 #import "RCCManager.h"
3
 #import "RCCManager.h"
4
 #import <React/RCTEventDispatcher.h>
4
 #import <React/RCTEventDispatcher.h>
5
 #import <React/RCTConvert.h>
5
 #import <React/RCTConvert.h>
6
+#import <React/RCTRootView.h>
6
 #import <objc/runtime.h>
7
 #import <objc/runtime.h>
7
 #import "RCCTitleViewHelper.h"
8
 #import "RCCTitleViewHelper.h"
9
+#import "RCCCustomBarButtonItem.h"
8
 #import "UIViewController+Rotation.h"
10
 #import "UIViewController+Rotation.h"
9
 #import "RCTHelpers.h"
11
 #import "RCTHelpers.h"
10
 
12
 
333
     UIImage *iconImage = nil;
335
     UIImage *iconImage = nil;
334
     id icon = button[@"icon"];
336
     id icon = button[@"icon"];
335
     if (icon) iconImage = [RCTConvert UIImage:icon];
337
     if (icon) iconImage = [RCTConvert UIImage:icon];
336
-    
338
+    NSString *__nullable component = button[@"component"];
339
+
337
     UIBarButtonItem *barButtonItem;
340
     UIBarButtonItem *barButtonItem;
338
     if (iconImage)
341
     if (iconImage)
339
     {
342
     {
348
         [barButtonItem setTitleTextAttributes:buttonTextAttributes forState:UIControlStateNormal];
351
         [barButtonItem setTitleTextAttributes:buttonTextAttributes forState:UIControlStateNormal];
349
       }
352
       }
350
     }
353
     }
354
+    else if (component) {
355
+      RCTBridge *bridge = [[RCCManager sharedInstance] getBridge];
356
+      barButtonItem = [[RCCCustomBarButtonItem alloc] initWithComponentName:component passProps:button[@"passProps"] bridge:bridge];
357
+    }
351
     else continue;
358
     else continue;
352
     objc_setAssociatedObject(barButtonItem, &CALLBACK_ASSOCIATED_KEY, button[@"onPress"], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
359
     objc_setAssociatedObject(barButtonItem, &CALLBACK_ASSOCIATED_KEY, button[@"onPress"], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
353
     [barButtonItems addObject:barButtonItem];
360
     [barButtonItems addObject:barButtonItem];

+ 6
- 0
ios/ReactNativeNavigation.xcodeproj/project.pbxproj View File

11
 		261108801E6C495400BF5D98 /* UIViewController+Rotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2611087F1E6C495400BF5D98 /* UIViewController+Rotation.m */; };
11
 		261108801E6C495400BF5D98 /* UIViewController+Rotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 2611087F1E6C495400BF5D98 /* UIViewController+Rotation.m */; };
12
 		26714EAC1EB0E9D3009F4D52 /* RCCCustomTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 26714EAB1EB0E9D3009F4D52 /* RCCCustomTitleView.m */; };
12
 		26714EAC1EB0E9D3009F4D52 /* RCCCustomTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 26714EAB1EB0E9D3009F4D52 /* RCCCustomTitleView.m */; };
13
 		26AFF3F51D7EEE2400CBA211 /* RCCTitleViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 26AFF3F41D7EEE2400CBA211 /* RCCTitleViewHelper.m */; };
13
 		26AFF3F51D7EEE2400CBA211 /* RCCTitleViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 26AFF3F41D7EEE2400CBA211 /* RCCTitleViewHelper.m */; };
14
+		2DCD499A1F33AAC30035123A /* RCCCustomBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DCD49981F33AAC30035123A /* RCCCustomBarButtonItem.m */; };
14
 		CC84A19E1C1A0C4E00B3A6A2 /* RCCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CC84A1941C1A0C4E00B3A6A2 /* RCCManager.m */; };
15
 		CC84A19E1C1A0C4E00B3A6A2 /* RCCManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CC84A1941C1A0C4E00B3A6A2 /* RCCManager.m */; };
15
 		CC84A19F1C1A0C4E00B3A6A2 /* RCCManagerModule.m in Sources */ = {isa = PBXBuildFile; fileRef = CC84A1961C1A0C4E00B3A6A2 /* RCCManagerModule.m */; };
16
 		CC84A19F1C1A0C4E00B3A6A2 /* RCCManagerModule.m in Sources */ = {isa = PBXBuildFile; fileRef = CC84A1961C1A0C4E00B3A6A2 /* RCCManagerModule.m */; };
16
 		CC84A1A01C1A0C4E00B3A6A2 /* RCCNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = CC84A1981C1A0C4E00B3A6A2 /* RCCNavigationController.m */; };
17
 		CC84A1A01C1A0C4E00B3A6A2 /* RCCNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = CC84A1981C1A0C4E00B3A6A2 /* RCCNavigationController.m */; };
58
 		26714EAB1EB0E9D3009F4D52 /* RCCCustomTitleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCCCustomTitleView.m; sourceTree = "<group>"; };
59
 		26714EAB1EB0E9D3009F4D52 /* RCCCustomTitleView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCCCustomTitleView.m; sourceTree = "<group>"; };
59
 		26AFF3F31D7EEE2400CBA211 /* RCCTitleViewHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCCTitleViewHelper.h; path = Helpers/RCCTitleViewHelper.h; sourceTree = "<group>"; };
60
 		26AFF3F31D7EEE2400CBA211 /* RCCTitleViewHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCCTitleViewHelper.h; path = Helpers/RCCTitleViewHelper.h; sourceTree = "<group>"; };
60
 		26AFF3F41D7EEE2400CBA211 /* RCCTitleViewHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCCTitleViewHelper.m; path = Helpers/RCCTitleViewHelper.m; sourceTree = "<group>"; };
61
 		26AFF3F41D7EEE2400CBA211 /* RCCTitleViewHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCCTitleViewHelper.m; path = Helpers/RCCTitleViewHelper.m; sourceTree = "<group>"; };
62
+2DCD49981F33AAC30035123A /* RCCCustomBarButtonItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCCCustomBarButtonItem.m; path = RCCCustomBarButtonItem.m; sourceTree = "<group>"; };
63
+		2DCD49991F33AAC30035123A /* RCCCustomBarButtonItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCCCustomBarButtonItem.h; path = RCCCustomBarButtonItem.h; sourceTree = "<group>"; };
61
 		CC84A1931C1A0C4E00B3A6A2 /* RCCManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCCManager.h; sourceTree = "<group>"; };
64
 		CC84A1931C1A0C4E00B3A6A2 /* RCCManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCCManager.h; sourceTree = "<group>"; };
62
 		CC84A1941C1A0C4E00B3A6A2 /* RCCManager.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = RCCManager.m; sourceTree = "<group>"; tabWidth = 2; };
65
 		CC84A1941C1A0C4E00B3A6A2 /* RCCManager.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.objc; path = RCCManager.m; sourceTree = "<group>"; tabWidth = 2; };
63
 		CC84A1951C1A0C4E00B3A6A2 /* RCCManagerModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCCManagerModule.h; sourceTree = "<group>"; };
66
 		CC84A1951C1A0C4E00B3A6A2 /* RCCManagerModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCCManagerModule.h; sourceTree = "<group>"; };
204
 				D85082BB1CBCF42400FDB961 /* RCCDrawerController */,
207
 				D85082BB1CBCF42400FDB961 /* RCCDrawerController */,
205
 				CC84A1931C1A0C4E00B3A6A2 /* RCCManager.h */,
208
 				CC84A1931C1A0C4E00B3A6A2 /* RCCManager.h */,
206
 				CC84A1941C1A0C4E00B3A6A2 /* RCCManager.m */,
209
 				CC84A1941C1A0C4E00B3A6A2 /* RCCManager.m */,
210
+				2DCD49991F33AAC30035123A /* RCCCustomBarButtonItem.h */,
211
+				2DCD49981F33AAC30035123A /* RCCCustomBarButtonItem.m */,
207
 				26714EAA1EB0E9D3009F4D52 /* RCCCustomTitleView.h */,
212
 				26714EAA1EB0E9D3009F4D52 /* RCCCustomTitleView.h */,
208
 				26714EAB1EB0E9D3009F4D52 /* RCCCustomTitleView.m */,
213
 				26714EAB1EB0E9D3009F4D52 /* RCCCustomTitleView.m */,
209
 				26AFF3F31D7EEE2400CBA211 /* RCCTitleViewHelper.h */,
214
 				26AFF3F31D7EEE2400CBA211 /* RCCTitleViewHelper.h */,
303
 			files = (
308
 			files = (
304
 				D85082EA1CBCF54200FDB961 /* TheSidebarController.m in Sources */,
309
 				D85082EA1CBCF54200FDB961 /* TheSidebarController.m in Sources */,
305
 				CC84A1A01C1A0C4E00B3A6A2 /* RCCNavigationController.m in Sources */,
310
 				CC84A1A01C1A0C4E00B3A6A2 /* RCCNavigationController.m in Sources */,
311
+				2DCD499A1F33AAC30035123A /* RCCCustomBarButtonItem.m in Sources */,
306
 				D83514F61D29719A00D53758 /* RCCNotification.m in Sources */,
312
 				D83514F61D29719A00D53758 /* RCCNotification.m in Sources */,
307
 				CC84A19F1C1A0C4E00B3A6A2 /* RCCManagerModule.m in Sources */,
313
 				CC84A19F1C1A0C4E00B3A6A2 /* RCCManagerModule.m in Sources */,
308
 				26AFF3F51D7EEE2400CBA211 /* RCCTitleViewHelper.m in Sources */,
314
 				26AFF3F51D7EEE2400CBA211 /* RCCTitleViewHelper.m in Sources */,