Quellcode durchsuchen

SetStyle fix (#2539)

* fixes #2524
yogevbd vor 6 Jahren
Ursprung
Commit
883dcfe49f
Es ist kein Benutzerkonto mit dieser Commiter-Email verbunden

+ 7
- 4
android/app/src/main/java/com/reactnativenavigation/layouts/BottomTabsLayout.java Datei anzeigen

@@ -16,6 +16,7 @@ import com.facebook.react.bridge.Callback;
16 16
 import com.facebook.react.bridge.Promise;
17 17
 import com.facebook.react.bridge.WritableMap;
18 18
 import com.reactnativenavigation.NavigationApplication;
19
+import com.reactnativenavigation.events.Event;
19 20
 import com.reactnativenavigation.events.EventBus;
20 21
 import com.reactnativenavigation.events.ScreenChangedEvent;
21 22
 import com.reactnativenavigation.params.ActivityParams;
@@ -229,6 +230,8 @@ public class BottomTabsLayout extends BaseLayout implements AHBottomNavigation.O
229 230
         for (int i = 0; i < bottomTabs.getItemsCount(); i++) {
230 231
             screenStacks[i].updateScreenStyle(screenInstanceId, styleParams);
231 232
         }
233
+
234
+        bottomTabs.setStyleFromScreen(this.getCurrentScreen().getStyleParams());
232 235
     }
233 236
 
234 237
     @Override
@@ -360,7 +363,7 @@ public class BottomTabsLayout extends BaseLayout implements AHBottomNavigation.O
360 363
 
361 364
     private boolean hasBackgroundColor(StyleParams params) {
362 365
         return params.screenBackgroundColor != null &&
363
-            params.screenBackgroundColor.hasColor();
366
+                params.screenBackgroundColor.hasColor();
364 367
     }
365 368
 
366 369
     private void setStyleFromScreen(StyleParams params) {
@@ -391,7 +394,7 @@ public class BottomTabsLayout extends BaseLayout implements AHBottomNavigation.O
391 394
         performOnStack(params.getNavigatorId(), new Task<ScreenStack>() {
392 395
             @Override
393 396
             public void run(ScreenStack stack) {
394
-            stack.pop(params.animateScreenTransitions, params.timestamp, new ScreenStack.OnScreenPop() {
397
+                stack.pop(params.animateScreenTransitions, params.timestamp, new ScreenStack.OnScreenPop() {
395 398
                     @Override
396 399
                     public void onScreenPopAnimationEnd() {
397 400
                         setBottomTabsStyleFromCurrentScreen();
@@ -450,8 +453,8 @@ public class BottomTabsLayout extends BaseLayout implements AHBottomNavigation.O
450 453
             task.run(screenStack);
451 454
         } catch (ScreenStackNotFoundException e) {
452 455
             Log.e("Navigation", "Could not perform action on stack [" + navigatorId + "]." +
453
-                                      "This should not have happened, it probably means a navigator action" +
454
-                                      "was called from an unmounted tab.");
456
+                    "This should not have happened, it probably means a navigator action" +
457
+                    "was called from an unmounted tab.");
455 458
         }
456 459
     }
457 460
 

+ 8
- 0
android/app/src/main/java/com/reactnativenavigation/params/parsers/StyleParamsParser.java Datei anzeigen

@@ -131,6 +131,14 @@ public class StyleParamsParser {
131 131
         result.titleBarHeight = -1;
132 132
         result.screenAnimationType = "slide-up";
133 133
         result.drawUnderStatusBar = false;
134
+
135
+        result.bottomTabsColor = getDefaultBottomTabsColor();
136
+        result.bottomTabsButtonColor = getDefaultBottomTabsButtonColor();
137
+        result.selectedBottomTabsButtonColor = getDefaultSelectedBottomTabsButtonColor();
138
+
139
+        result.bottomTabBadgeTextColor = getBottomTabBadgeTextColor();
140
+        result.bottomTabBadgeBackgroundColor = getBottomTabBadgeBackgroundColor();
141
+
134 142
         return result;
135 143
     }
136 144
 

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/screens/Screen.java Datei anzeigen

@@ -216,7 +216,7 @@ public abstract class Screen extends RelativeLayout implements Subscriber {
216 216
     }
217 217
 
218 218
     public void setTitleBarTitle(String title) {
219
-       topBar.setTitle(title, styleParams);
219
+        topBar.setTitle(title, styleParams);
220 220
     }
221 221
 
222 222
     public void setTitleBarSubtitle(String subtitle) {

+ 22
- 28
android/app/src/main/java/com/reactnativenavigation/views/BottomTabs.java Datei anzeigen

@@ -2,6 +2,7 @@ package com.reactnativenavigation.views;
2 2
 
3 3
 import android.content.Context;
4 4
 import android.graphics.Color;
5
+import android.os.Bundle;
5 6
 import android.text.TextUtils;
6 7
 
7 8
 import com.aurelhubert.ahbottomnavigation.AHBottomNavigation;
@@ -10,6 +11,7 @@ import com.reactnativenavigation.animation.VisibilityAnimator;
10 11
 import com.reactnativenavigation.params.AppStyle;
11 12
 import com.reactnativenavigation.params.ScreenParams;
12 13
 import com.reactnativenavigation.params.StyleParams;
14
+import com.reactnativenavigation.params.parsers.StyleParamsParser;
13 15
 import com.reactnativenavigation.utils.ViewUtils;
14 16
 import com.reactnativenavigation.views.utils.Constants;
15 17
 
@@ -21,17 +23,17 @@ public class BottomTabs extends AHBottomNavigation {
21 23
 
22 24
     public BottomTabs(Context context) {
23 25
         super(context);
26
+
24 27
         setForceTint(true);
25 28
         setId(ViewUtils.generateViewId());
26 29
         createVisibilityAnimator();
27
-        setStyle();
30
+        setStyle(AppStyle.appStyle);
28 31
         setFontFamily();
29 32
     }
30 33
 
31 34
     public void addTabs(List<ScreenParams> params, OnTabSelectedListener onTabSelectedListener) {
32 35
         for (ScreenParams screenParams : params) {
33
-            AHBottomNavigationItem item = new AHBottomNavigationItem(screenParams.tabLabel, screenParams.tabIcon,
34
-                    Color.GRAY);
36
+            AHBottomNavigationItem item = new AHBottomNavigationItem(screenParams.tabLabel, screenParams.tabIcon, Color.GRAY);
35 37
             addItem(item);
36 38
             setOnTabSelectedListener(onTabSelectedListener);
37 39
         }
@@ -39,19 +41,7 @@ public class BottomTabs extends AHBottomNavigation {
39 41
     }
40 42
 
41 43
     public void setStyleFromScreen(StyleParams params) {
42
-        if (params.bottomTabsColor.hasColor()) {
43
-            setBackgroundColor(params.bottomTabsColor);
44
-        }
45
-        if (params.bottomTabsButtonColor.hasColor()) {
46
-            if (getInactiveColor() != params.bottomTabsButtonColor.getColor()) {
47
-                setInactiveColor(params.bottomTabsButtonColor.getColor());
48
-            }
49
-        }
50
-        if (params.selectedBottomTabsButtonColor.hasColor()) {
51
-            if (getAccentColor() != params.selectedBottomTabsButtonColor.getColor()) {
52
-                setAccentColor(params.selectedBottomTabsButtonColor.getColor());
53
-            }
54
-        }
44
+        this.setStyle(params);
55 45
 
56 46
         setVisibility(params.bottomTabsHidden, true);
57 47
     }
@@ -132,23 +122,27 @@ public class BottomTabs extends AHBottomNavigation {
132 122
                 Constants.BOTTOM_TABS_HEIGHT);
133 123
     }
134 124
 
135
-    private void setStyle() {
136
-        if (hasBadgeBackgroundColor()) {
125
+    private void setStyle(StyleParams params) {
126
+        if (params.bottomTabBadgeBackgroundColor.hasColor()) {
137 127
             setNotificationBackgroundColor(AppStyle.appStyle.bottomTabBadgeBackgroundColor.getColor());
138 128
         }
139
-        if (hasBadgeTextColor()) {
129
+        if (params.bottomTabBadgeTextColor.hasColor()) {
140 130
             setNotificationTextColor(AppStyle.appStyle.bottomTabBadgeTextColor.getColor());
141 131
         }
142
-    }
143 132
 
144
-    private boolean hasBadgeTextColor() {
145
-        return AppStyle.appStyle.bottomTabBadgeTextColor != null &&
146
-               AppStyle.appStyle.bottomTabBadgeTextColor.hasColor();
147
-    }
148
-
149
-    private boolean hasBadgeBackgroundColor() {
150
-        return AppStyle.appStyle.bottomTabBadgeBackgroundColor != null &&
151
-               AppStyle.appStyle.bottomTabBadgeBackgroundColor.hasColor();
133
+        if (params.bottomTabsColor.hasColor()) {
134
+            setBackgroundColor(params.bottomTabsColor);
135
+        }
136
+        if (params.bottomTabsButtonColor.hasColor()) {
137
+            if (getInactiveColor() != params.bottomTabsButtonColor.getColor()) {
138
+                setInactiveColor(params.bottomTabsButtonColor.getColor());
139
+            }
140
+        }
141
+        if (params.selectedBottomTabsButtonColor.hasColor()) {
142
+            if (getAccentColor() != params.selectedBottomTabsButtonColor.getColor()) {
143
+                setAccentColor(params.selectedBottomTabsButtonColor.getColor());
144
+            }
145
+        }
152 146
     }
153 147
 
154 148
     private void setFontFamily() {

+ 19
- 17
ios/RCCNavigationController.m Datei anzeigen

@@ -339,23 +339,25 @@ NSString const *CALLBACK_ASSOCIATED_ID = @"RCCNavigationController.CALLBACK_ASSO
339 339
   // setStyle
340 340
   if ([performAction isEqualToString:@"setStyle"])
341 341
   {
342
-    
343
-    NSDictionary *navigatorStyle = actionParams;
344
-    
345
-    // merge the navigatorStyle of our parent
346
-    if ([self.topViewController isKindOfClass:[RCCViewController class]])
347
-    {
348
-      RCCViewController *parent = (RCCViewController*)self.topViewController;
349
-      NSMutableDictionary *mergedStyle = [NSMutableDictionary dictionaryWithDictionary:parent.navigatorStyle];
350
-      
351
-      // there are a few styles that we don't want to remember from our parent (they should be local)
352
-      [mergedStyle setValuesForKeysWithDictionary:navigatorStyle];
353
-      navigatorStyle = mergedStyle;
354
-      
355
-      parent.navigatorStyle = navigatorStyle;
356
-      
357
-      [parent setStyleOnInit];
358
-      [parent updateStyle];
342
+    for (UIViewController *viewController in self.viewControllers) {
343
+      if ([viewController isKindOfClass:[RCCViewController class]])
344
+      {
345
+        RCCViewController *rccViewController = (RCCViewController*)viewController;
346
+        
347
+        NSDictionary *navigatorStyle = [[NSDictionary alloc] initWithDictionary:actionParams copyItems:YES];
348
+        NSMutableDictionary *mergedStyle = [NSMutableDictionary dictionaryWithDictionary:rccViewController.navigatorStyle];
349
+        
350
+        // there are a few styles that we don't want to remember from our parent (they should be local)
351
+        [mergedStyle setValuesForKeysWithDictionary:navigatorStyle];
352
+        
353
+        rccViewController.navigatorStyle = mergedStyle;
354
+        
355
+        [rccViewController setStyleOnInit];
356
+        
357
+        if (viewController == self.topViewController) {
358
+          [rccViewController updateStyle];
359
+        }
360
+      }
359 361
     }
360 362
   }
361 363
 }

+ 1
- 0
ios/RCCTabBarController.h Datei anzeigen

@@ -5,6 +5,7 @@
5 5
 
6 6
 - (instancetype)initWithProps:(NSDictionary *)props children:(NSArray *)children globalProps:(NSDictionary*)globalProps bridge:(RCTBridge *)bridge;
7 7
 - (void)performAction:(NSString*)performAction actionParams:(NSDictionary*)actionParams bridge:(RCTBridge *)bridge completion:(void (^)(void))completion;
8
++ (UIImage *)image:(UIImage*)image withColor:(UIColor *)color1;
8 9
 
9 10
 @property (nonatomic) BOOL tabBarHidden;
10 11
 

+ 3
- 3
ios/RCCTabBarController.m Datei anzeigen

@@ -55,7 +55,7 @@
55 55
   return YES;
56 56
 }
57 57
 
58
-- (UIImage *)image:(UIImage*)image withColor:(UIColor *)color1
58
++ (UIImage *)image:(UIImage*)image withColor:(UIColor *)color1
59 59
 {
60 60
   UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
61 61
   CGContextRef context = UIGraphicsGetCurrentContext();
@@ -159,7 +159,7 @@
159 159
       iconImage = [RCTConvert UIImage:icon];
160 160
       if (buttonColor)
161 161
       {
162
-        iconImage = [[self image:iconImage withColor:buttonColor] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
162
+        iconImage = [[RCCTabBarController image:iconImage withColor:buttonColor] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
163 163
       }
164 164
     }
165 165
     UIImage *iconImageSelected = nil;
@@ -327,7 +327,7 @@
327 327
       if (icon && icon != (id)[NSNull null])
328 328
       {
329 329
         iconImage = [RCTConvert UIImage:icon];
330
-        iconImage = [[self image:iconImage withColor:self.tabBar.tintColor] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
330
+        iconImage = [[RCCTabBarController image:iconImage withColor:self.tabBar.tintColor] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
331 331
         viewController.tabBarItem.image = iconImage;
332 332
       }
333 333
       

+ 88
- 4
ios/RCCViewController.m Datei anzeigen

@@ -478,11 +478,95 @@ const NSInteger TRANSPARENT_NAVBAR_TAG = 78264803;
478 478
     [viewController setNeedsStatusBarAppearanceUpdate];
479 479
   }
480 480
   
481
-  NSNumber *tabBarHidden = self.navigatorStyle[@"tabBarHidden"];
482
-  BOOL tabBarHiddenBool = tabBarHidden ? [tabBarHidden boolValue] : NO;
483
-  if (tabBarHiddenBool) {
481
+  if (viewController.tabBarController && viewController.tabBarController.tabBar != (id)[NSNull null]) {
484 482
     UITabBar *tabBar = viewController.tabBarController.tabBar;
485
-    tabBar.transform = CGAffineTransformMakeTranslation(0, tabBar.frame.size.height);
483
+    
484
+    if (tabBar && tabBar != (id)[NSNull null]) {
485
+      UIColor *buttonColor = nil;
486
+      UIColor *selectedButtonColor = nil;
487
+      UIColor *labelColor = nil;
488
+      UIColor *selectedLabelColor = nil;
489
+      
490
+      NSNumber *tabBarHidden = self.navigatorStyle[@"tabBarHidden"];
491
+      BOOL tabBarHiddenBool = tabBarHidden ? [tabBarHidden boolValue] : NO;
492
+      if (tabBarHiddenBool) {
493
+        tabBar.transform = CGAffineTransformMakeTranslation(0, tabBar.frame.size.height);
494
+      }
495
+      
496
+      NSString *tabBarButtonColor = self.navigatorStyle[@"tabBarButtonColor"];
497
+      NSString *tabBarSelectedButtonColor = self.navigatorStyle[@"tabBarSelectedButtonColor"];
498
+      
499
+      if (tabBarButtonColor)
500
+      {
501
+        buttonColor = tabBarButtonColor != (id)[NSNull null] ? [RCTConvert UIColor:tabBarButtonColor] : nil;
502
+        
503
+        if (tabBarSelectedButtonColor) {
504
+          selectedButtonColor = tabBarSelectedButtonColor != (id)[NSNull null] ? [RCTConvert UIColor:tabBarSelectedButtonColor] : nil;
505
+          
506
+          tabBar.tintColor = selectedLabelColor = selectedButtonColor;
507
+          tabBar.unselectedItemTintColor = labelColor = buttonColor;
508
+        }
509
+        else {
510
+          tabBar.tintColor = labelColor = buttonColor;
511
+        }
512
+      }
513
+      else if (tabBarSelectedButtonColor) {
514
+        selectedButtonColor = tabBarSelectedButtonColor != (id)[NSNull null] ? [RCTConvert UIColor:tabBarSelectedButtonColor] : nil;
515
+        tabBar.tintColor = selectedLabelColor = selectedButtonColor;
516
+      }
517
+      
518
+      NSString *tabBarLabelColor = self.navigatorStyle[@"tabBarLabelColor"];
519
+      if(tabBarLabelColor) {
520
+        UIColor *color = tabBarLabelColor != (id)[NSNull null] ? [RCTConvert UIColor:tabBarLabelColor] : nil;
521
+        labelColor = color;
522
+      }
523
+      NSString *tabBarSelectedLabelColor = self.navigatorStyle[@"tabBarSelectedLabelColor"];
524
+      if(tabBarLabelColor) {
525
+        UIColor *color = tabBarSelectedLabelColor != (id)[NSNull null] ? [RCTConvert UIColor:tabBarSelectedLabelColor] : nil;
526
+        selectedLabelColor = color;
527
+      }
528
+      
529
+      NSString *tabBarBackgroundColor = self.navigatorStyle[@"tabBarBackgroundColor"];
530
+      if (tabBarBackgroundColor)
531
+      {
532
+        UIColor *color = tabBarBackgroundColor != (id)[NSNull null] ? [RCTConvert UIColor:tabBarBackgroundColor] : nil;
533
+        tabBar.barTintColor = color;
534
+      }
535
+      
536
+      NSNumber *tabBarTranslucent = self.navigatorStyle[@"tabBarTranslucent"];
537
+      if (tabBarTranslucent)
538
+      {
539
+        BOOL tabBarTranslucentBool = tabBarTranslucent ? [tabBarTranslucent boolValue] : NO;
540
+        tabBar.translucent = tabBarTranslucentBool;
541
+      }
542
+      
543
+      NSNumber *tabBarHideShadow = self.navigatorStyle[@"tabBarHideShadow"];
544
+      if (tabBarHideShadow)
545
+      {
546
+        BOOL tabBarHideShadowBool = tabBarHideShadow ? [tabBarHideShadow boolValue] : NO;
547
+        tabBar.clipsToBounds = tabBarHideShadowBool ? YES : NO;
548
+      }
549
+      
550
+      for (UIViewController *tabViewController in [viewController.tabBarController viewControllers]) {
551
+        NSMutableDictionary *unselectedAttributes = [RCTHelpers textAttributesFromDictionary:self.navigatorStyle withPrefix:@"tabBarText" baseFont:[UIFont systemFontOfSize:10]];
552
+        if (!unselectedAttributes[NSForegroundColorAttributeName] && labelColor) {
553
+          unselectedAttributes[NSForegroundColorAttributeName] = labelColor;
554
+        }
555
+        [tabViewController.tabBarItem setTitleTextAttributes:unselectedAttributes forState:UIControlStateNormal];
556
+        
557
+        
558
+        NSMutableDictionary *selectedAttributes = [RCTHelpers textAttributesFromDictionary:self.navigatorStyle withPrefix:@"tabBarSelectedText" baseFont:[UIFont systemFontOfSize:10]];
559
+        if (!selectedAttributes[NSForegroundColorAttributeName] && selectedLabelColor) {
560
+          selectedAttributes[NSForegroundColorAttributeName] = selectedLabelColor;
561
+        }
562
+        [tabViewController.tabBarItem setTitleTextAttributes:selectedAttributes forState:UIControlStateSelected];
563
+        
564
+        if (buttonColor)
565
+        {
566
+          tabViewController.tabBarItem.image = [[RCCTabBarController image:tabViewController.tabBarItem.image withColor:buttonColor] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
567
+        }
568
+      }
569
+    }
486 570
   }
487 571
 
488 572
   NSNumber *navBarHidden = self.navigatorStyle[@"navBarHidden"];