diff --git a/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm b/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm index 0341fec26c..373add689b 100644 --- a/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm +++ b/ios/bottom-tabs/RNSBottomTabsScreenComponentView.mm @@ -35,6 +35,7 @@ @implementation RNSBottomTabsScreenComponentView { #if !RCT_NEW_ARCH_ENABLED BOOL _tabItemNeedsAppearanceUpdate; BOOL _tabScreenOrientationNeedsUpdate; + BOOL _tabBarItemNeedsBaseChange; BOOL _tabBarItemNeedsUpdate; BOOL _scrollEdgeEffectsNeedUpdate; #endif // !RCT_NEW_ARCH_ENABLED @@ -64,6 +65,7 @@ - (void)initState #if !RCT_NEW_ARCH_ENABLED _tabItemNeedsAppearanceUpdate = NO; _tabScreenOrientationNeedsUpdate = NO; + _tabBarItemNeedsBaseChange = NO; _tabBarItemNeedsUpdate = NO; _scrollEdgeEffectsNeedUpdate = NO; #endif @@ -172,7 +174,7 @@ - (void)updateContentScrollViewEdgeEffectsIfExists #pragma mark - Prop update utils -- (void)updateTabBarItem +- (void)changeBaseTabBarItem { UITabBarItem *tabBarItem = nil; if (_systemItem != RNSBottomTabsScreenSystemItemNone) { @@ -181,14 +183,24 @@ - (void)updateTabBarItem tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:systemItem tag:0]; } else { tabBarItem = [[UITabBarItem alloc] init]; - tabBarItem.title = _title; } - tabBarItem.badgeValue = _badgeValue; - _controller.tabBarItem = tabBarItem; } +- (void)updateTabBarItem +{ + UITabBarItem *tabBarItem = _controller.tabBarItem; + + if (![tabBarItem.title isEqualToString:_title]) { + tabBarItem.title = _title; + } + + if (![tabBarItem.badgeValue isEqualToString:_badgeValue]) { + tabBarItem.badgeValue = _badgeValue; + } +} + #pragma mark - RNSSafeAreaProviding - (UIEdgeInsets)providerSafeAreaInsets @@ -222,6 +234,7 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props bool tabItemNeedsAppearanceUpdate{false}; bool tabScreenOrientationNeedsUpdate{false}; + bool tabBarItemNeedsBaseChange{false}; bool tabBarItemNeedsUpdate{false}; bool scrollEdgeEffectsNeedUpdate{false}; @@ -274,33 +287,28 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props if (newComponentProps.iconType != oldComponentProps.iconType) { _iconType = rnscreens::conversion::RNSBottomTabsIconTypeFromIcon(newComponentProps.iconType); tabItemNeedsAppearanceUpdate = YES; - tabBarItemNeedsUpdate = YES; } if (newComponentProps.iconImageSource != oldComponentProps.iconImageSource) { _iconImageSource = rnscreens::conversion::RCTImageSourceFromImageSourceAndIconType(&newComponentProps.iconImageSource, _iconType); tabItemNeedsAppearanceUpdate = YES; - tabBarItemNeedsUpdate = YES; } if (newComponentProps.iconSfSymbolName != oldComponentProps.iconSfSymbolName) { _iconSfSymbolName = RCTNSStringFromStringNilIfEmpty(newComponentProps.iconSfSymbolName); tabItemNeedsAppearanceUpdate = YES; - tabBarItemNeedsUpdate = YES; } if (newComponentProps.selectedIconImageSource != oldComponentProps.selectedIconImageSource) { _selectedIconImageSource = rnscreens::conversion::RCTImageSourceFromImageSourceAndIconType( &newComponentProps.selectedIconImageSource, _iconType); tabItemNeedsAppearanceUpdate = YES; - tabBarItemNeedsUpdate = YES; } if (newComponentProps.selectedIconSfSymbolName != oldComponentProps.selectedIconSfSymbolName) { _selectedIconSfSymbolName = RCTNSStringFromStringNilIfEmpty(newComponentProps.selectedIconSfSymbolName); tabItemNeedsAppearanceUpdate = YES; - tabBarItemNeedsUpdate = YES; } if (newComponentProps.specialEffects.repeatedTabSelection.popToRoot != @@ -334,7 +342,7 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props if (newComponentProps.systemItem != oldComponentProps.systemItem) { _systemItem = rnscreens::conversion::RNSBottomTabsScreenSystemItemFromReactRNSBottomTabsScreenSystemItem( newComponentProps.systemItem); - tabBarItemNeedsUpdate = YES; + tabBarItemNeedsBaseChange = YES; } if (newComponentProps.bottomScrollEdgeEffect != oldComponentProps.bottomScrollEdgeEffect) { @@ -367,6 +375,11 @@ - (void)updateProps:(const facebook::react::Props::Shared &)props scrollEdgeEffectsNeedUpdate = YES; } + if (tabBarItemNeedsBaseChange) { + [self changeBaseTabBarItem]; + tabBarItemNeedsUpdate = YES; + } + if (tabBarItemNeedsUpdate) { [self updateTabBarItem]; @@ -445,6 +458,13 @@ - (void)didSetProps:(NSArray *)changedProps // didSetProps will always be called because tabKey prop is required. _isOverrideScrollViewContentInsetAdjustmentBehaviorSet = YES; + if (_tabBarItemNeedsBaseChange) { + [self changeBaseTabBarItem]; + _tabBarItemNeedsBaseChange = NO; + + _tabBarItemNeedsUpdate = YES; + } + if (_tabBarItemNeedsUpdate) { [self updateTabBarItem]; _tabBarItemNeedsUpdate = NO; @@ -501,35 +521,30 @@ - (void)setIconType:(RNSBottomTabsIconType)iconType { _iconType = iconType; _tabItemNeedsAppearanceUpdate = YES; - _tabBarItemNeedsUpdate = YES; } - (void)setIconImageSource:(RCTImageSource *)iconImageSource { _iconImageSource = iconImageSource; _tabItemNeedsAppearanceUpdate = YES; - _tabBarItemNeedsUpdate = YES; } - (void)setIconSfSymbolName:(NSString *)iconSfSymbolName { _iconSfSymbolName = [NSString rnscreens_stringOrNilIfEmpty:iconSfSymbolName]; _tabItemNeedsAppearanceUpdate = YES; - _tabBarItemNeedsUpdate = YES; } - (void)setSelectedIconImageSource:(RCTImageSource *)selectedIconImageSource { _selectedIconImageSource = selectedIconImageSource; _tabItemNeedsAppearanceUpdate = YES; - _tabBarItemNeedsUpdate = YES; } - (void)setSelectedIconSfSymbolName:(NSString *)selectedIconSfSymbolName { _selectedIconSfSymbolName = [NSString rnscreens_stringOrNilIfEmpty:selectedIconSfSymbolName]; _tabItemNeedsAppearanceUpdate = YES; - _tabBarItemNeedsUpdate = YES; } - (void)setBottomScrollEdgeEffect:(RNSScrollEdgeEffect)bottomScrollEdgeEffect @@ -596,7 +611,7 @@ - (void)setScrollEdgeAppearance:(NSDictionary *)scrollEdgeAppearanceProps - (void)setSystemItem:(RNSBottomTabsScreenSystemItem)systemItem { _systemItem = systemItem; - _tabBarItemNeedsUpdate = YES; + _tabBarItemNeedsBaseChange = YES; } - (void)setOrientation:(RNSOrientation)orientation diff --git a/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.mm b/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.mm index dff5cbf534..a24a6f1bef 100644 --- a/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.mm +++ b/ios/bottom-tabs/RNSTabBarAppearanceCoordinator.mm @@ -55,10 +55,20 @@ - (void)setIconsForTabBarItem:(UITabBarItem *)tabBarItem if (screenView.iconType == RNSBottomTabsIconTypeSfSymbol) { if (screenView.iconSfSymbolName != nil) { tabBarItem.image = [UIImage systemImageNamed:screenView.iconSfSymbolName]; + } else if (screenView.systemItem != RNSBottomTabsScreenSystemItemNone) { + // Restore default system item icon + UITabBarSystemItem systemItem = + rnscreens::conversion::RNSBottomTabsScreenSystemItemToUITabBarSystemItem(screenView.systemItem); + tabBarItem.image = [[UITabBarItem alloc] initWithTabBarSystemItem:systemItem tag:0].image; } if (screenView.selectedIconSfSymbolName != nil) { tabBarItem.selectedImage = [UIImage systemImageNamed:screenView.selectedIconSfSymbolName]; + } else if (screenView.systemItem != RNSBottomTabsScreenSystemItemNone) { + // Restore default system item icon + UITabBarSystemItem systemItem = + rnscreens::conversion::RNSBottomTabsScreenSystemItemToUITabBarSystemItem(screenView.systemItem); + tabBarItem.selectedImage = [[UITabBarItem alloc] initWithTabBarSystemItem:systemItem tag:0].selectedImage; } } else if (imageLoader != nil) { bool isTemplate = screenView.iconType == RNSBottomTabsIconTypeTemplate;