react-native-navigation 8.7.6-snapshot.2279 → 8.7.6-snapshot.2352
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/reactnativenavigation/react/NavigationModule.java +2 -2
- package/android/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/ButtonBar.kt +2 -0
- package/android/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/IconBackgroundDrawable.kt +20 -17
- package/android/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/TitleAndButtonsMeasurer.kt +2 -1
- package/android/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/TitleBarReactView.kt +7 -10
- package/android/src/main/res/values/styles.xml +2 -0
- package/ios/BottomTabsAfterInitialTabAttacher.mm +31 -0
- package/ios/BottomTabsAppearancePresenter.mm +69 -32
- package/ios/BottomTabsBasePresenter.mm +5 -4
- package/ios/RCTHelpers.mm +3 -1
- package/ios/RNNAppDelegate.mm +10 -0
- package/ios/RNNBottomTabsController.mm +19 -6
- package/ios/RNNBottomTabsOptions.mm +5 -1
- package/ios/RNNBridgeManager.mm +2 -0
- package/ios/RNNComponentViewController.mm +4 -2
- package/ios/RNNModalHostViewManagerHandler.h +5 -0
- package/ios/RNNModalHostViewManagerHandler.mm +2 -0
- package/ios/RNNOverlayWindow.mm +1 -2
- package/ios/TopBarAppearancePresenter.mm +9 -2
- package/package.json +11 -11
|
@@ -232,11 +232,11 @@ public class NavigationModule extends ReactContextBaseJavaModule {
|
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
@Override
|
|
235
|
-
public void
|
|
235
|
+
public void invalidate() {
|
|
236
236
|
final NavigationActivity navigationActivity = activity();
|
|
237
237
|
if (navigationActivity != null) {
|
|
238
238
|
navigationActivity.onCatalystInstanceDestroy();
|
|
239
239
|
}
|
|
240
|
-
super.
|
|
240
|
+
super.invalidate();
|
|
241
241
|
}
|
|
242
242
|
}
|
package/android/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/ButtonBar.kt
CHANGED
|
@@ -11,6 +11,7 @@ import android.view.View
|
|
|
11
11
|
import android.view.ViewGroup
|
|
12
12
|
import androidx.appcompat.widget.ActionMenuView
|
|
13
13
|
import androidx.appcompat.widget.Toolbar
|
|
14
|
+
import com.reactnativenavigation.R
|
|
14
15
|
import com.reactnativenavigation.utils.ObjectUtils
|
|
15
16
|
import com.reactnativenavigation.utils.ViewUtils
|
|
16
17
|
import com.reactnativenavigation.viewcontrollers.stack.topbar.button.ButtonController
|
|
@@ -21,6 +22,7 @@ open class ButtonBar internal constructor(context: Context) : Toolbar(context) {
|
|
|
21
22
|
init {
|
|
22
23
|
super.setContentInsetsAbsolute(0, 0)
|
|
23
24
|
this.contentInsetStartWithNavigation = 0
|
|
25
|
+
setPopupTheme(R.style.TopBarOverflowPopup)
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
override fun onViewAdded(child: View) {
|
|
@@ -8,12 +8,12 @@ import com.reactnativenavigation.options.params.DensityPixel
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class IconBackgroundDrawable(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
private val wrapped: Drawable,
|
|
12
|
+
private val cornerRadius: DensityPixel,
|
|
13
|
+
private val backgroundWidth: Int,
|
|
14
|
+
private val backgroundHeight: Int,
|
|
15
|
+
private val iconColor: Int?,
|
|
16
|
+
val backgroundColor: Int?
|
|
17
17
|
) : Drawable() {
|
|
18
18
|
private val path: Path = Path()
|
|
19
19
|
private val bitmapPaint = Paint().apply {
|
|
@@ -56,28 +56,31 @@ class IconBackgroundDrawable(
|
|
|
56
56
|
canvas.drawBitmap(wrapped.toBitmap(), null, bitmapRect, bitmapPaint)
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
override fun getIntrinsicWidth(): Int = backgroundWidth
|
|
60
|
+
override fun getIntrinsicHeight(): Int = backgroundHeight
|
|
61
|
+
|
|
59
62
|
override fun setBounds(l: Int, t: Int, r: Int, b: Int) {
|
|
60
|
-
updatePath(RectF(
|
|
61
|
-
super.setBounds(l, t, backgroundWidth, backgroundHeight)
|
|
63
|
+
updatePath(RectF(0f, 0f, backgroundWidth.toFloat(), backgroundHeight.toFloat()))
|
|
64
|
+
super.setBounds(l, t, l + backgroundWidth, t + backgroundHeight)
|
|
62
65
|
}
|
|
63
66
|
|
|
64
67
|
override fun setBounds(r: Rect) {
|
|
65
|
-
r.right = backgroundWidth
|
|
66
|
-
r.bottom = backgroundHeight
|
|
67
|
-
updatePath(RectF(
|
|
68
|
+
r.right = r.left + backgroundWidth
|
|
69
|
+
r.bottom = r.top + backgroundHeight
|
|
70
|
+
updatePath(RectF(0f, 0f, backgroundWidth.toFloat(), backgroundHeight.toFloat()))
|
|
68
71
|
super.setBounds(r)
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
override fun onBoundsChange(bounds: Rect) {
|
|
72
75
|
if (bounds != null) {
|
|
73
76
|
backgroundRect = Rect((bounds.width() - backgroundWidth) / 2,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
+
(bounds.height() - backgroundHeight) / 2,
|
|
78
|
+
bounds.width() - (bounds.width() - backgroundWidth) / 2,
|
|
79
|
+
bounds.height() - (bounds.height() - backgroundHeight) / 2)
|
|
77
80
|
bitmapRect = Rect((bounds.width() - bitmapWidth) / 2,
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
+
(bounds.height() - bitmapHeight) / 2,
|
|
82
|
+
bounds.width() - (bounds.width() - bitmapWidth) / 2,
|
|
83
|
+
bounds.height() - (bounds.height() - bitmapHeight) / 2)
|
|
81
84
|
}
|
|
82
85
|
super.onBoundsChange(bounds)
|
|
83
86
|
}
|
|
@@ -17,7 +17,8 @@ typealias TitleBottom = Int
|
|
|
17
17
|
|
|
18
18
|
fun makeTitleAtMostWidthMeasureSpec(containerWidth: Int, rightBarWidth: Int, leftBarWidth: Int, isCenter: Boolean, isFill: Boolean = false): Int {
|
|
19
19
|
return if (isCenter) {
|
|
20
|
-
|
|
20
|
+
val availableWidth = containerWidth - rightBarWidth - leftBarWidth
|
|
21
|
+
View.MeasureSpec.makeMeasureSpec(availableWidth, View.MeasureSpec.AT_MOST)
|
|
21
22
|
} else {
|
|
22
23
|
val availableWidth = containerWidth - rightBarWidth - leftBarWidth - 2 * DEFAULT_LEFT_MARGIN_PX
|
|
23
24
|
View.MeasureSpec.makeMeasureSpec(
|
|
@@ -3,25 +3,22 @@ package com.reactnativenavigation.views.stack.topbar.titlebar
|
|
|
3
3
|
import android.annotation.SuppressLint
|
|
4
4
|
import android.content.Context
|
|
5
5
|
import android.view.View
|
|
6
|
-
import android.view.ViewGroup
|
|
7
|
-
import androidx.core.view.children
|
|
8
|
-
import com.facebook.react.ReactInstanceManager
|
|
9
6
|
import com.reactnativenavigation.react.ReactView
|
|
10
7
|
|
|
11
8
|
@SuppressLint("ViewConstructor")
|
|
12
9
|
class TitleBarReactView(context: Context?, componentId: String?,
|
|
13
10
|
componentName: String?) : ReactView(context, componentId, componentName) {
|
|
14
11
|
var centered: Boolean = false
|
|
12
|
+
|
|
15
13
|
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
16
|
-
var titleHeightMeasureSpec: Int
|
|
17
|
-
var titleWidthMeasureSpec: Int
|
|
18
14
|
if (centered) {
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
val availableWidth = MeasureSpec.getSize(widthMeasureSpec)
|
|
16
|
+
super.onMeasure(
|
|
17
|
+
MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST),
|
|
18
|
+
heightMeasureSpec
|
|
19
|
+
)
|
|
21
20
|
} else {
|
|
22
|
-
|
|
23
|
-
titleWidthMeasureSpec = widthMeasureSpec
|
|
21
|
+
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
|
24
22
|
}
|
|
25
|
-
super.onMeasure(titleWidthMeasureSpec, titleHeightMeasureSpec)
|
|
26
23
|
}
|
|
27
24
|
}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
<item name="elevation">0dp</item>
|
|
5
5
|
</style>
|
|
6
6
|
|
|
7
|
+
<style name="TopBarOverflowPopup" parent="ThemeOverlay.AppCompat.Light" />
|
|
8
|
+
|
|
7
9
|
<!--The following is a workaround needed to run unit tests in command line-->
|
|
8
10
|
<style name="Widget.Support.CoordinatorLayout" parent="android:Widget">
|
|
9
11
|
@null
|
|
@@ -8,7 +8,38 @@
|
|
|
8
8
|
[bottomTabsController readyForPresentation];
|
|
9
9
|
for (UIViewController *viewController in bottomTabsController.deselectedViewControllers) {
|
|
10
10
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
11
|
+
UIWindow *preloadWindow = [[UIWindow alloc] initWithFrame:CGRectZero];
|
|
12
|
+
preloadWindow.hidden = NO;
|
|
13
|
+
|
|
14
|
+
dispatch_group_t ready = dispatch_group_create();
|
|
15
|
+
dispatch_group_enter(ready);
|
|
16
|
+
|
|
17
|
+
viewController.waitForRender = YES;
|
|
18
|
+
|
|
19
|
+
[viewController setReactViewReadyCallback:^{
|
|
20
|
+
dispatch_group_leave(ready);
|
|
21
|
+
}];
|
|
22
|
+
|
|
11
23
|
[viewController render];
|
|
24
|
+
|
|
25
|
+
UIView *containerView = nil;
|
|
26
|
+
UIView *reactView = nil;
|
|
27
|
+
if ([viewController isKindOfClass:[UINavigationController class]]) {
|
|
28
|
+
containerView = [(UINavigationController *)viewController topViewController].view;
|
|
29
|
+
reactView = containerView.subviews.firstObject;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (reactView && !reactView.window) {
|
|
33
|
+
[preloadWindow addSubview:reactView];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
dispatch_notify(ready, dispatch_get_main_queue(), ^{
|
|
37
|
+
if (reactView) {
|
|
38
|
+
reactView.frame = containerView.bounds;
|
|
39
|
+
[containerView addSubview:reactView];
|
|
40
|
+
}
|
|
41
|
+
preloadWindow.hidden = YES;
|
|
42
|
+
});
|
|
12
43
|
});
|
|
13
44
|
}
|
|
14
45
|
}];
|
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
#pragma mark - public
|
|
8
8
|
|
|
9
9
|
- (void)applyBackgroundColor:(UIColor *)backgroundColor translucent:(BOOL)translucent {
|
|
10
|
+
if (@available(iOS 26.0, *)) {
|
|
11
|
+
[self setTabBarTransparentBackground];
|
|
12
|
+
self.tabBar.backgroundColor = UIColor.clearColor;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
10
15
|
if (translucent)
|
|
11
16
|
[self setTabBarTranslucent:YES];
|
|
12
17
|
else if (backgroundColor.isTransparent)
|
|
@@ -19,26 +24,33 @@
|
|
|
19
24
|
|
|
20
25
|
- (void)applyTabBarBorder:(RNNBottomTabsOptions *)options {
|
|
21
26
|
if (options.borderColor.hasValue || options.borderWidth.hasValue) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
UIImage *borderImage = [UIImage
|
|
28
|
+
imageWithSize:CGSizeMake(1.0, [[options.borderWidth withDefault:@(0.1)] floatValue])
|
|
29
|
+
color:[options.borderColor withDefault:UIColor.blackColor]];
|
|
30
|
+
|
|
31
|
+
for (UIViewController *childViewController in self.tabBarController.childViewControllers) {
|
|
32
|
+
childViewController.tabBarItem.standardAppearance.shadowImage = borderImage;
|
|
33
|
+
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000
|
|
34
|
+
if (@available(iOS 15.0, *)) {
|
|
35
|
+
childViewController.tabBarItem.scrollEdgeAppearance.shadowImage = borderImage;
|
|
36
|
+
}
|
|
37
|
+
#endif
|
|
38
|
+
}
|
|
26
39
|
}
|
|
27
40
|
}
|
|
28
41
|
|
|
29
42
|
- (void)setTabBarBackgroundColor:(UIColor *)backgroundColor {
|
|
30
|
-
[self
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
#endif
|
|
43
|
+
UITabBarAppearance *appearance = [self appearanceWithColor:backgroundColor];
|
|
44
|
+
[self applyTabBarAppearance:appearance];
|
|
45
|
+
self.tabBar.barTintColor = backgroundColor;
|
|
46
|
+
self.tabBar.translucent = NO;
|
|
47
|
+
if (@available(iOS 26.0, *)) {
|
|
48
|
+
self.tabBar.backgroundColor = backgroundColor;
|
|
38
49
|
}
|
|
39
50
|
}
|
|
40
51
|
|
|
41
52
|
- (void)setTabBarTranslucent:(BOOL)translucent {
|
|
53
|
+
self.tabBar.translucent = translucent;
|
|
42
54
|
if (translucent)
|
|
43
55
|
[self setTabBarTranslucentBackground];
|
|
44
56
|
else
|
|
@@ -48,38 +60,63 @@
|
|
|
48
60
|
#pragma mark - private
|
|
49
61
|
|
|
50
62
|
- (void)setTabBarDefaultBackground {
|
|
51
|
-
|
|
63
|
+
if (@available(iOS 26.0, *)) {
|
|
64
|
+
[self setTabBarTransparentBackground];
|
|
65
|
+
self.tabBar.backgroundColor = UIColor.clearColor;
|
|
66
|
+
} else {
|
|
67
|
+
[self setTabBarOpaqueBackground];
|
|
68
|
+
}
|
|
52
69
|
}
|
|
53
70
|
|
|
54
71
|
- (void)setTabBarTranslucentBackground {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
[childViewController.tabBarItem.scrollEdgeAppearance configureWithDefaultBackground];
|
|
60
|
-
}
|
|
61
|
-
#endif
|
|
62
|
-
}
|
|
72
|
+
UITabBarAppearance *appearance = [UITabBarAppearance new];
|
|
73
|
+
[appearance configureWithDefaultBackground];
|
|
74
|
+
[self applyTabBarAppearance:appearance];
|
|
75
|
+
self.tabBar.barTintColor = nil;
|
|
63
76
|
}
|
|
64
77
|
|
|
65
78
|
- (void)setTabBarTransparentBackground {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
#endif
|
|
74
|
-
}
|
|
79
|
+
UITabBarAppearance *appearance = [UITabBarAppearance new];
|
|
80
|
+
[appearance configureWithTransparentBackground];
|
|
81
|
+
appearance.backgroundEffect = nil;
|
|
82
|
+
appearance.backgroundColor = UIColor.clearColor;
|
|
83
|
+
[self applyTabBarAppearance:appearance];
|
|
84
|
+
self.tabBar.barTintColor = UIColor.clearColor;
|
|
75
85
|
}
|
|
76
86
|
|
|
77
87
|
- (void)setTabBarOpaqueBackground {
|
|
88
|
+
UITabBarAppearance *appearance = [self appearanceWithColor:nil];
|
|
89
|
+
[self applyTabBarAppearance:appearance];
|
|
90
|
+
self.tabBar.barTintColor = UIColor.systemBackgroundColor;
|
|
91
|
+
self.tabBar.translucent = NO;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
#pragma mark - helpers
|
|
95
|
+
|
|
96
|
+
- (UITabBarAppearance *)appearanceWithColor:(UIColor *)color {
|
|
97
|
+
UITabBarAppearance *appearance = [UITabBarAppearance new];
|
|
98
|
+
[appearance configureWithOpaqueBackground];
|
|
99
|
+
appearance.backgroundEffect = nil;
|
|
100
|
+
appearance.shadowColor = nil;
|
|
101
|
+
UIColor *resolvedColor = color ?: UIColor.systemBackgroundColor;
|
|
102
|
+
appearance.backgroundColor = resolvedColor;
|
|
103
|
+
appearance.backgroundImage = [UIImage imageWithSize:CGSizeMake(1, 1) color:resolvedColor];
|
|
104
|
+
return appearance;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
- (void)applyTabBarAppearance:(UITabBarAppearance *)appearance {
|
|
108
|
+
self.tabBar.standardAppearance = appearance;
|
|
109
|
+
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000
|
|
110
|
+
if (@available(iOS 15.0, *)) {
|
|
111
|
+
self.tabBar.scrollEdgeAppearance = [appearance copy];
|
|
112
|
+
}
|
|
113
|
+
#endif
|
|
114
|
+
|
|
78
115
|
for (UIViewController *childViewController in self.tabBarController.childViewControllers) {
|
|
79
|
-
|
|
116
|
+
childViewController.tabBarItem.standardAppearance = [appearance copy];
|
|
80
117
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000
|
|
81
118
|
if (@available(iOS 15.0, *)) {
|
|
82
|
-
|
|
119
|
+
childViewController.tabBarItem.scrollEdgeAppearance = [appearance copy];
|
|
83
120
|
}
|
|
84
121
|
#endif
|
|
85
122
|
}
|
|
@@ -27,11 +27,12 @@
|
|
|
27
27
|
[bottomTabs setTabBarVisible:[withDefault.bottomTabs.visible withDefault:YES]];
|
|
28
28
|
|
|
29
29
|
[bottomTabs.view setBackgroundColor:[withDefault.layout.backgroundColor withDefault:nil]];
|
|
30
|
+
[bottomTabs setTabBarHideShadow:[withDefault.bottomTabs.hideShadow withDefault:NO]];
|
|
31
|
+
if (options.bottomTabs.barStyle.hasValue) {
|
|
32
|
+
[bottomTabs setTabBarStyle:[RNNConvert UIBarStyle:options.bottomTabs.barStyle.get]];
|
|
33
|
+
}
|
|
30
34
|
[self applyBackgroundColor:[withDefault.bottomTabs.backgroundColor withDefault:nil]
|
|
31
35
|
translucent:[withDefault.bottomTabs.translucent withDefault:NO]];
|
|
32
|
-
[bottomTabs setTabBarHideShadow:[withDefault.bottomTabs.hideShadow withDefault:NO]];
|
|
33
|
-
[bottomTabs setTabBarStyle:[RNNConvert UIBarStyle:[withDefault.bottomTabs.barStyle
|
|
34
|
-
withDefault:@"default"]]];
|
|
35
36
|
[self applyTabBarBorder:withDefault.bottomTabs];
|
|
36
37
|
[self applyTabBarShadow:withDefault.bottomTabs.shadow];
|
|
37
38
|
}
|
|
@@ -65,7 +66,7 @@
|
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
if (mergeOptions.bottomTabs.translucent.hasValue) {
|
|
68
|
-
[
|
|
69
|
+
[self setTabBarTranslucent:mergeOptions.bottomTabs.translucent.get];
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
if (mergeOptions.bottomTabs.hideShadow.hasValue) {
|
package/ios/RCTHelpers.mm
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#import "RCTHelpers.h"
|
|
2
2
|
#import <React/RCTFont.h>
|
|
3
|
+
#if __has_include(<React/RCTScrollView.h>)
|
|
3
4
|
#import <React/RCTScrollView.h>
|
|
5
|
+
#endif
|
|
4
6
|
#import <React/RCTView.h>
|
|
5
7
|
|
|
6
8
|
@implementation RCTHelpers
|
|
@@ -201,7 +203,7 @@
|
|
|
201
203
|
UIView *yelloboxParentView = view;
|
|
202
204
|
while (view.superview != nil) {
|
|
203
205
|
yelloboxParentView = yelloboxParentView.superview;
|
|
204
|
-
if ([yelloboxParentView isKindOfClass:
|
|
206
|
+
if ([yelloboxParentView isKindOfClass:NSClassFromString(@"RCTScrollView")]) {
|
|
205
207
|
yelloboxParentView = yelloboxParentView.superview;
|
|
206
208
|
break;
|
|
207
209
|
}
|
package/ios/RNNAppDelegate.mm
CHANGED
|
@@ -5,11 +5,17 @@
|
|
|
5
5
|
|
|
6
6
|
#import "RCTAppSetupUtils.h"
|
|
7
7
|
#import <React/CoreModulesPlugins.h>
|
|
8
|
+
#if __has_include(<React/RCTCxxBridgeDelegate.h>)
|
|
8
9
|
#import <React/RCTCxxBridgeDelegate.h>
|
|
10
|
+
#endif
|
|
9
11
|
#import <React/RCTLegacyViewManagerInteropComponentView.h>
|
|
10
12
|
#import <React/RCTSurfacePresenter.h>
|
|
13
|
+
#if __has_include(<React/RCTSurfacePresenterStub.h>)
|
|
11
14
|
#import <React/RCTSurfacePresenterStub.h>
|
|
15
|
+
#endif
|
|
16
|
+
#if __has_include(<React/RCTSurfacePresenterBridgeAdapter.h>)
|
|
12
17
|
#import <React/RCTSurfacePresenterBridgeAdapter.h>
|
|
18
|
+
#endif
|
|
13
19
|
#import <ReactCommon/RCTTurboModuleManager.h>
|
|
14
20
|
|
|
15
21
|
#if __has_include(<react/config/ReactNativeConfig.h>)
|
|
@@ -19,9 +25,13 @@
|
|
|
19
25
|
#import <react/renderer/runtimescheduler/RuntimeScheduler.h>
|
|
20
26
|
#import <react/renderer/runtimescheduler/RuntimeSchedulerCallInvoker.h>
|
|
21
27
|
#import <React/RCTSurfacePresenter.h>
|
|
28
|
+
#if __has_include(<React/RCTBridge+Private.h>)
|
|
22
29
|
#import <React/RCTBridge+Private.h>
|
|
30
|
+
#endif
|
|
23
31
|
#import <React/RCTImageLoader.h>
|
|
32
|
+
#if __has_include(<React/RCTBridgeProxy.h>)
|
|
24
33
|
#import <React/RCTBridgeProxy.h>
|
|
34
|
+
#endif
|
|
25
35
|
#import <React/RCTSurfacePresenter.h>
|
|
26
36
|
#import <react/utils/ManagedObjectWrapper.h>
|
|
27
37
|
|
|
@@ -48,14 +48,27 @@
|
|
|
48
48
|
eventEmitter:eventEmitter
|
|
49
49
|
childViewControllers:childViewControllers];
|
|
50
50
|
|
|
51
|
-
if (@available(iOS
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
if (@available(iOS 26.0, *)) {
|
|
52
|
+
UITabBarAppearance *appearance = [UITabBarAppearance new];
|
|
53
|
+
[appearance configureWithTransparentBackground];
|
|
54
|
+
appearance.backgroundEffect = nil;
|
|
55
|
+
appearance.backgroundColor = UIColor.clearColor;
|
|
56
|
+
self.tabBar.standardAppearance = appearance;
|
|
57
|
+
self.tabBar.scrollEdgeAppearance = [appearance copy];
|
|
58
|
+
self.tabBar.barTintColor = UIColor.clearColor;
|
|
59
|
+
} else if (@available(iOS 13.0, *)) {
|
|
60
|
+
UITabBarAppearance *appearance = [UITabBarAppearance new];
|
|
61
|
+
[appearance configureWithOpaqueBackground];
|
|
62
|
+
appearance.backgroundEffect = nil;
|
|
63
|
+
appearance.backgroundColor = UIColor.systemBackgroundColor;
|
|
64
|
+
self.tabBar.standardAppearance = appearance;
|
|
54
65
|
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 150000
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
66
|
+
if (@available(iOS 15.0, *)) {
|
|
67
|
+
self.tabBar.scrollEdgeAppearance = [appearance copy];
|
|
68
|
+
}
|
|
58
69
|
#endif
|
|
70
|
+
self.tabBar.translucent = NO;
|
|
71
|
+
}
|
|
59
72
|
|
|
60
73
|
[self createTabBarItems:childViewControllers];
|
|
61
74
|
|
|
@@ -72,7 +72,11 @@
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
- (BOOL)shouldDrawBehind {
|
|
75
|
-
|
|
75
|
+
BOOL defaultDrawBehind = NO;
|
|
76
|
+
if (@available(iOS 26.0, *)) {
|
|
77
|
+
defaultDrawBehind = YES;
|
|
78
|
+
}
|
|
79
|
+
return [self.drawBehind withDefault:defaultDrawBehind] || [self.translucent withDefault:NO] ||
|
|
76
80
|
![self.visible withDefault:YES];
|
|
77
81
|
}
|
|
78
82
|
|
package/ios/RNNBridgeManager.mm
CHANGED
|
@@ -107,8 +107,10 @@
|
|
|
107
107
|
|
|
108
108
|
- (void)onJavaScriptLoaded {
|
|
109
109
|
[_commandsHandler setReadyToReceiveCommands:true];
|
|
110
|
+
#ifndef RCT_REMOVE_LEGACY_ARCH
|
|
110
111
|
[_modalHostViewHandler
|
|
111
112
|
connectModalHostViewManager:[self.bridge moduleForClass:RCTModalHostViewManager.class]];
|
|
113
|
+
#endif
|
|
112
114
|
[[_bridge moduleForClass:[RNNBridgeEventEmitter class]] sendOnAppLaunched];
|
|
113
115
|
}
|
|
114
116
|
|
|
@@ -91,6 +91,7 @@
|
|
|
91
91
|
}];
|
|
92
92
|
self.reactView.backgroundColor = UIColor.clearColor;
|
|
93
93
|
self.reactView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
|
|
94
|
+
self.reactView.clipsToBounds = YES;
|
|
94
95
|
[self.reactView setFrame:self.view.frame];
|
|
95
96
|
[self.view addSubview:self.reactView];
|
|
96
97
|
[self updateReactViewFrame];
|
|
@@ -118,14 +119,15 @@
|
|
|
118
119
|
if (self.isViewLoaded && self.reactView) {
|
|
119
120
|
CGFloat bottomInset = self.shouldDrawBehindBottomTabs ? 0 : self.view.safeAreaInsets.bottom;
|
|
120
121
|
CGFloat topInset = self.shouldDrawBehindTopBar ? 0 : self.view.safeAreaInsets.top;
|
|
122
|
+
|
|
121
123
|
[self.reactView setFrame:CGRectMake(0, topInset, self.view.frame.size.width,
|
|
122
124
|
self.view.frame.size.height - topInset - bottomInset)];
|
|
123
125
|
}
|
|
124
126
|
}
|
|
125
127
|
|
|
126
128
|
- (BOOL)shouldDrawBehindBottomTabs {
|
|
127
|
-
return
|
|
128
|
-
|
|
129
|
+
return !self.tabBarController.tabBar || self.tabBarController.tabBar.isHidden ||
|
|
130
|
+
_drawBehindBottomTabs;
|
|
129
131
|
}
|
|
130
132
|
|
|
131
133
|
- (BOOL)shouldDrawBehindTopBar {
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
#import "RNNModalManager.h"
|
|
2
2
|
#import <Foundation/Foundation.h>
|
|
3
|
+
|
|
4
|
+
#ifndef RCT_REMOVE_LEGACY_ARCH
|
|
3
5
|
#import <React/RCTModalHostViewManager.h>
|
|
6
|
+
#endif
|
|
4
7
|
|
|
5
8
|
@interface RNNModalHostViewManagerHandler : NSObject
|
|
6
9
|
|
|
7
10
|
- (instancetype)initWithModalManager:(RNNModalManager *)modalManager;
|
|
8
11
|
|
|
12
|
+
#ifndef RCT_REMOVE_LEGACY_ARCH
|
|
9
13
|
- (void)connectModalHostViewManager:(RCTModalHostViewManager *)modalHostViewManager;
|
|
14
|
+
#endif
|
|
10
15
|
|
|
11
16
|
@end
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
return self;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
#ifndef RCT_REMOVE_LEGACY_ARCH
|
|
13
14
|
- (void)connectModalHostViewManager:(RCTModalHostViewManager *)modalHostViewManager {
|
|
14
15
|
modalHostViewManager.presentationBlock =
|
|
15
16
|
^(UIViewController *reactViewController, UIViewController *viewController, BOOL animated,
|
|
@@ -36,5 +37,6 @@
|
|
|
36
37
|
}];
|
|
37
38
|
};
|
|
38
39
|
}
|
|
40
|
+
#endif
|
|
39
41
|
|
|
40
42
|
@end
|
package/ios/RNNOverlayWindow.mm
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#import "RNNOverlayWindow.h"
|
|
2
2
|
#import "RNNReactView.h"
|
|
3
|
-
#import <React/RCTModalHostView.h>
|
|
4
3
|
|
|
5
4
|
@implementation RNNOverlayWindow
|
|
6
5
|
|
|
@@ -9,7 +8,7 @@
|
|
|
9
8
|
|
|
10
9
|
if ([hitTestResult isKindOfClass:[UIWindow class]] ||
|
|
11
10
|
[hitTestResult.subviews.firstObject isKindOfClass:RNNReactView.class] ||
|
|
12
|
-
[hitTestResult isKindOfClass:
|
|
11
|
+
[hitTestResult isKindOfClass:NSClassFromString(@"RCTModalHostView")] ||
|
|
13
12
|
[hitTestResult isKindOfClass:NSClassFromString(@"RCTRootComponentView")]) {
|
|
14
13
|
return nil;
|
|
15
14
|
}
|
|
@@ -22,8 +22,10 @@
|
|
|
22
22
|
|
|
23
23
|
[self setTitleAttributes:options.title];
|
|
24
24
|
[self setLargeTitleAttributes:options.largeTitle];
|
|
25
|
-
if (options.scrollEdgeAppearance.title
|
|
25
|
+
if (options.scrollEdgeAppearance.title.hasValue) {
|
|
26
26
|
[self setScrollEdgeTitleAttributes:options.scrollEdgeAppearance.title];
|
|
27
|
+
} else {
|
|
28
|
+
[self setScrollEdgeTitleAttributes:options.title];
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
[self setBorderColor:[options.borderColor withDefault:nil]];
|
|
@@ -53,6 +55,12 @@
|
|
|
53
55
|
if (options.scrollEdgeAppearance.noBorder.hasValue) {
|
|
54
56
|
[self showScrollEdgeBorder:!options.scrollEdgeAppearance.noBorder.get];
|
|
55
57
|
}
|
|
58
|
+
|
|
59
|
+
if (options.scrollEdgeAppearance.title.hasValue) {
|
|
60
|
+
[self setScrollEdgeTitleAttributes:defaultOptions.scrollEdgeAppearance.title];
|
|
61
|
+
} else if (options.title.hasValue && !defaultOptions.scrollEdgeAppearance.title.hasValue) {
|
|
62
|
+
[self setScrollEdgeTitleAttributes:defaultOptions.title];
|
|
63
|
+
}
|
|
56
64
|
}
|
|
57
65
|
|
|
58
66
|
- (void)setTranslucent:(BOOL)translucent {
|
|
@@ -160,7 +168,6 @@
|
|
|
160
168
|
}
|
|
161
169
|
|
|
162
170
|
self.getAppearance.titleTextAttributes = titleTextAttributes;
|
|
163
|
-
self.getScrollEdgeAppearance.titleTextAttributes = titleTextAttributes;
|
|
164
171
|
}
|
|
165
172
|
|
|
166
173
|
- (void)setScrollEdgeTitleAttributes:(RNNTitleOptions *)titleOptions {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-navigation",
|
|
3
|
-
"version": "8.7.6-snapshot.
|
|
3
|
+
"version": "8.7.6-snapshot.2352",
|
|
4
4
|
"description": "React Native Navigation - truly native navigation for iOS and Android",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"nativePackage": true,
|
|
@@ -94,15 +94,16 @@
|
|
|
94
94
|
"@babel/preset-env": "^7.25.3",
|
|
95
95
|
"@babel/runtime": "^7.25.0",
|
|
96
96
|
"@babel/types": "7.25.0",
|
|
97
|
+
"@d11/react-native-fast-image": "^8.13.0",
|
|
97
98
|
"@react-native-community/cli": "20.0.0",
|
|
98
99
|
"@react-native-community/cli-platform-android": "20.0.0",
|
|
99
100
|
"@react-native-community/cli-platform-ios": "20.0.0",
|
|
100
101
|
"@react-native-community/datetimepicker": "^8.2.0",
|
|
101
102
|
"@react-native-community/netinfo": "^11.4.1",
|
|
102
|
-
"@react-native/babel-preset": "0.
|
|
103
|
-
"@react-native/eslint-config": "0.
|
|
104
|
-
"@react-native/metro-config": "0.
|
|
105
|
-
"@react-native/typescript-config": "0.
|
|
103
|
+
"@react-native/babel-preset": "0.84.0",
|
|
104
|
+
"@react-native/eslint-config": "0.84.0",
|
|
105
|
+
"@react-native/metro-config": "0.84.0",
|
|
106
|
+
"@react-native/typescript-config": "0.84.0",
|
|
106
107
|
"@testing-library/jest-native": "^5.4.2",
|
|
107
108
|
"@testing-library/react-native": "^13.0.1",
|
|
108
109
|
"@types/hoist-non-react-statics": "^3.3.6",
|
|
@@ -130,15 +131,14 @@
|
|
|
130
131
|
"pixelmatch": "^5.2.1",
|
|
131
132
|
"pngjs": "^6.0.0",
|
|
132
133
|
"prettier": "2.8.8",
|
|
133
|
-
"react": "19.2.
|
|
134
|
-
"react-native": "0.
|
|
134
|
+
"react": "19.2.3",
|
|
135
|
+
"react-native": "0.84.0",
|
|
135
136
|
"react-native-builder-bob": "^0.40.13",
|
|
136
|
-
"react-native-fast-image": "^8.6.3",
|
|
137
137
|
"react-native-gesture-handler": "^2.29.1",
|
|
138
|
-
"react-native-reanimated": "4.
|
|
139
|
-
"react-native-worklets": "0.
|
|
138
|
+
"react-native-reanimated": "4.2.2",
|
|
139
|
+
"react-native-worklets": "0.7.4",
|
|
140
140
|
"react-redux": "9.1.2",
|
|
141
|
-
"react-test-renderer": "19.2.
|
|
141
|
+
"react-test-renderer": "19.2.3",
|
|
142
142
|
"redux": "^5.0.1",
|
|
143
143
|
"remx": "3.x.x",
|
|
144
144
|
"semver": "5.x.x",
|